zoukankan      html  css  js  c++  java
  • ElasticSearch搜索服务技术

    ElasticSearch

      基于的lucene开发的搜索服务技术;天生支持分布式;

    Es的结构

      

    • gatway:存储层,所有的数据可以存储在本地(多个es节点形成分布式存储),hdfs输出位置,共享文件等
    • 分布式lucene框架:把lucene缺少的分布式支持,做成一个基于lucene的框架
    • ES自定义功能:ES自己的功能实现,例如关闭,打开索引,设置索引的读写权限等
    • 功能插件:实现集群的管理,形成各种自定义插件,discovery自动发现功能
    • 传输协议:支持http协议,支持thrift(AVRO)
    • 用户接口: java api DSL操作命令基于http协议,发起的restFul传参操作ES

    ElasticSearch存储应用概念

      索引index:lucene中提到的索引文件,这个整体看来类似数据库中的某个库

      类型Type: 在一个索引中,可以有不同结构的document存在,一批一批的相似结构,把同一批结构相同的document定义为一个类型(field结构相同);类似于数据库的表格
       映射mapping: 不同类型中的各种field的属性(String int,分词计算器指定谁,长度,特性等等),都可以在mapping映射中体现;类似数据库的schema(结构)
       文档document:搜索的数据基本单位,一个数据整体,document.类似数据库中一行数据记录row,类似java中的一个pojo对象
      域属性field:类似于数据库中的一个列column

    ELK家族:es衍生了一系列的开源软件,统称 Elastic Stack,包括分布式搜索引擎es,日志采集logstash,可视化平台分析kibana

          

     ES的安装

      https://www.cnblogs.com/nanlinghan/p/10084639.html

    ES的配置

      https://www.cnblogs.com/nanlinghan/p/10084647.html

    java API 连接操作ES

    代码没有实现连接集群名称不是ealasticsearch的settings

    1 依赖pom的jar包,与lucene测试分开有冲突
        <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
                <version>5.5.2</version>
            </dependency>
    2 测试案例
        • 连接es
        创建一个连接对象TransportClient
        
    3 操作步骤
        • 索引的操作
        新增
        删除
        • 文档的操作
        新建文档
        curl 命令传递的是请求体中的json字符串,es解析json创建不同结构不同类型的document对象,代码中把对象转化的json字符串,添加的请求体中,完成document的创建
        {"id":10,
        "name":"**",
         "age":18
        }
        jackson 将pojo对象;easymall中的逻辑 es层,就是将数据库数据获取(持久层封装的就是pojo类对象),存入到es中需要转化成json
        添加jackson-bind的依赖
        <dependency>
                <groupId>com.fasterxml.jackson.core</groupId>
                <artifactId>jackson-databind</artifactId>
                <version>2.8.8</version>
            </dependency>
        创建一个对象pojo
        User对象
        Integer id
        String name;
      Integer age

      1 package com.jt.es.test;
      2 
      3 import java.io.IOException;
      4 import java.net.InetAddress;
      5 
      6 import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
      7 import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
      8 import org.elasticsearch.action.get.GetRequestBuilder;
      9 import org.elasticsearch.action.index.IndexResponse;
     10 import org.elasticsearch.action.search.SearchResponse;
     11 import org.elasticsearch.client.IndicesAdminClient;
     12 import org.elasticsearch.client.Requests;
     13 import org.elasticsearch.client.transport.TransportClient;
     14 import org.elasticsearch.common.settings.Settings;
     15 import org.elasticsearch.common.transport.InetSocketTransportAddress;
     16 import org.elasticsearch.common.xcontent.XContentBuilder;
     17 import org.elasticsearch.common.xcontent.XContentFactory;
     18 import org.elasticsearch.index.query.MatchQueryBuilder;
     19 import org.elasticsearch.index.query.Operator;
     20 import org.elasticsearch.index.query.QueryBuilders;
     21 import org.elasticsearch.search.SearchHit;
     22 import org.elasticsearch.search.SearchHits;
     23 import org.elasticsearch.transport.client.PreBuiltTransportClient;
     24 import org.junit.Before;
     25 import org.junit.Test;
     26 
     27 import com.fasterxml.jackson.core.JsonProcessingException;
     28 import com.fasterxml.jackson.databind.ObjectMapper;
     29 import com.jt.es.pojo.User;
     30 
     31 
     32 public class ESTest {
     33     private TransportClient client;
     34     //测试连接对象
     35     @Before
     36     public void initial() throws Exception{
     37         //自定义Settings
     38         //默认的empty中有一个就是集群名称 elasticsearch
     39         client=
     40                 new PreBuiltTransportClient(Settings.EMPTY);
     41         //传递ip和端口 9300,client可以调用多次add方法将集群其他可连接的
     42         //节点同时传递
     43         client.addTransportAddress(
     44                 new InetSocketTransportAddress(
     45                     InetAddress.getByName("10.9.100.26"),9300));
     46     }
     47     //创建索引
     48     @Test
     49     public void createIndex(){
     50         //利用连接客户端client,获取索引的管理对象indexAdminClient
     51         IndicesAdminClient indexClient = client.admin().indices();
     52         CreateIndexResponse cResponse = indexClient.prepareCreate("index05").get();
     53         //返回json {"acknowledged":true,"shards_acknowledged":true}
     54         System.out.println(cResponse.isAcknowledged());
     55         System.out.println(cResponse.isShardsAcked());
     56     }
     57     //删除
     58     @Test
     59     public void deleteIndex(){
     60         //利用连接客户端client,获取索引的管理对象indexAdminClient
     61         IndicesAdminClient indexClient = client.admin().indices();
     62         indexClient.prepareDelete("index05").get();//
     63     }
     64     
     65     //新建文档
     66     @Test
     67     public void createDoc() throws Exception{
     68         //准备json字符串
     69         User user=new User();
     70         user.setId(1);
     71         user.setName("王首富");
     72         user.setAge(18);
     73         ObjectMapper mapper=new ObjectMapper();
     74     String userJson=mapper.writeValueAsString(user);
     75     //连接对象创建 index05,user类型,1的document
     76     IndexResponse response = client.prepareIndex("index05", "user","1").
     77     setSource(userJson).execute().actionGet();
     78     System.out.println(response.toString());
     79     }
     80     
     81     //获取document
     82     @Test
     83     public void getDoc(){
     84         GetRequestBuilder response = client.prepareGet("index05", "user", "1");
     85         System.out.println(response.get().getSourceAsString());
     86         
     87     }
     88     
     89     //matchquery
     90     @Test
     91     public void query(){
     92         //封装查询对象query
     93         MatchQueryBuilder query = QueryBuilders.matchQuery("title", "java编程思想hadoop")
     94         .operator(Operator.OR);//查询结果必须包含条件中的所有分词
     95         //客户端调用查询对象获取查询结果
     96         // page rows
     97         int page=1;
     98         int rows=5;
     99         int start= (page-1)*rows;
    100         SearchResponse response = client.prepareSearch("book").
    101         setQuery(query).setFrom(start).setSize(rows).get();
    102         //获取响应结果中的数据,hits中
    103         SearchHits hits = response.getHits();
    104         System.out.println("共搜索到:"+hits.totalHits);
    105         for (SearchHit hit : hits) {
    106             //获取响应结果中的source
    107             System.out.println("title:"+hit.getSource().get("title"));
    108             System.out.println("content:"+hit.getSource().get("content"));
    109         }
    110     }
    111 }

     ES集群

    集群分布式和高可用在ES中都是默认配置和计算
        • 集群的分布式,es的所有数据默认5个分片,每个分片默认一个副本(总共每个分片有2分,一份值主分片,一份是从分片)
        • 集群配置完成后,启动所有集群节点,分片和副本的数据将会自动计算分配到不同的节点存储,只有从少到多的移动,没有从多到少的移动
      • 分片默认5片,副本默认1片,自动根据集群节点数量最优的分配,分片越多,节点越多,副本越多的时候,整个集群的分布式性能越高,高可用能力越高

  • 相关阅读:
    java集合框架复习(一)
    java集合框架复习
    java集合框架
    Mysql视图的作用及其性能分析
    php语法基础
    MySQL UNION 与 UNION ALL 语法与用法
    mysql fetch 系列函数
    跨线程传递数据解决方案 ThreadLocal 和 HystrixRequestVariableDefault
    java中带参数的try(){}语法含义是什么?
    Activiti 设置comment的用户
  • 原文地址:https://www.cnblogs.com/nanlinghan/p/9971223.html
Copyright © 2011-2022 走看看