分布式全文搜索引擎ES

                                ES

什么是ES文档操作:

  1.ES是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document)。然而它不仅仅是存储,还会索引(index)每个文档的内容使之可以被搜索。在ES中,你可以对文档(而非成行成列的数据)进行索引、搜索、排序、过滤。

  2.ES文档元素:

    1._index:索引库,类似于关系型数据库里的“数据库”—它是我们存储和索引关联数据的地方。

    2._type:在应用中,我们使用对象表示一些“事物”

    3.id:_index  _type  组合时,就可以在ELasticsearch中唯一标识一个文档

    4._source:文档原始数据

    5._all:所有字段的连接字符串

文档的增删改操作(resfoull风格):

  1.PUT {index}/{type}/{id}

  2.POST {index}/{type}

  3.GET itsource/employee/1?employee

DSL查询过滤:

  什么是查询过滤:只查出你想要的信息  屏蔽多余的信息

  DSL(Domain Specific Language特定领域语言)JSON请求体的形式出现

   GET _search

  

DSL过滤和DSL查询在性能上的区别 :

过滤结果可以缓存并应用到后续请求。

查询语句同时匹配文档,计算相关性,所以更耗时,且不缓存。

 过滤语句可有效地配合查询语句完成文档过滤。

分词与映射:

  为什么要分词与映射:

在全文检索理论中,文档的查询是通过关键字查询文档索引来进行匹配,因此将文本拆分为有意义的单词,对于搜索结果的准确性至关重要,因此,在建立索引的过程中和分析搜索语句的过程中都需要对文本串分词。

ES中分词需要对具体字段指定分词器等细节,因此需要在文档的映射中明确指出。

  IK分词器:源码下载地址

    https://github.com/medcl/elasticsearch-analysis-ik

集群操作:

  为什么要使用集群:

    处理高并发数据  单点故障和大量的数据的时候就要需要用到集群

Node有三种节点:  

       master Node:主节点,维护集群信息 索引库操作

       data  node:数据节点,  文档crud

       client node:只负责处理用户请求

1、默认情况下,每个节点都有成为主节点的资格,也会存储数据,还会处理客户端的请求。- 在生产环境下,如果不修改ElasticSearch节点的角色信息,在高数据量,高并发的场景下集群容易出现脑裂等问题

 2、在一个生产集群中我们可以对这些节点的职责进行划分。建议集群中设置3台以上的节点作为master节点【node.master: true node.data: false】,这些节点只负责成为主节点,维护整个集群的状态。       

    3、再根据数据量设置一批data节点【node.master: false node.data: true】,这些节点只负责存储数据,后期提供建立索引和查询索引的服务,这样的话如果用户请求比较频繁,这些节点的压力也会比较大。 

    4、在集群中建议再设置一批client节点【node.master: false node.data: true】,这些节点只负责处理用户请求,实现请求转发,负载均衡等功能。 

JavaAPI操作集群:

  什么是JavaAPI:ESJava提供一套操作索引库的工具包,即Java API。所有的ES操作都使用Client对象执行

第一:引入包

<dependency>

    <groupId>org.elasticsearch.client</groupId>

    <artifactId>transport</artifactId>

    <version>5.2.2</version>

</dependency>

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-api</artifactId>

    <version>2.7</version>

</dependency>

<dependency>

    <groupId>org.apache.logging.log4j</groupId>

    <artifactId>log4j-core</artifactId>

    <version>2.7</version>

</dependency>

第二:连接ES获取client对象

  

Settings settings = Settings.builder()

        .put("client.transport.sniff", true).build();

TransportClient client = new PreBuiltTransportClient(settings);

第三 创建文档索引:

import static org.elasticsearch.common.xcontent.XContentFactory.*;

IndexResponse response = client.prepareIndex("crm", "vip", "1")

.setSource(jsonDataText).get();

第四 获取文档:

GetResponse response = client.prepareGet("crm", "vip", "1").get();

下面就是增删改的代码:

  改:

client.prepareUpdate("crm", "vip", "1").setDoc("{\"sex\":0}").get();

client.prepareUpdate("crm", "vip", "1")

.setScript(new Script("ctx._source.sex = 1"  , ScriptService.ScriptType.INLINE,null, null))

            .get();

IndexRequest indexRequest = new IndexRequest("crm", "vip", "1")

.source(originalJsonData);

UpdateRequest updateRequest = new UpdateRequest("crm", "vip", "1")

.doc(updateJsonData).upsert(indexRequest);

client.update(updateRequest).get();

  删:

DeleteResponse response = client.prepareDelete("crm", "vip", "1").get();

  批量添加:

BulkRequestBuilder bulkRequest = client.prepareBulk();

bulkRequest.add(client.prepareIndex("crm", "vip", "1")

.setSource(vip1JsonData));

bulkRequest.add(client.prepareIndex("crm", "vip", "2")

.setSource(vip2JsonData));

BulkResponse bulkResponse = bulkRequest.get();

猜你喜欢

转载自www.cnblogs.com/1999wang/p/11517626.html