分布式全文搜索引擎ES

Posted 1999wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式全文搜索引擎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();

 

以上是关于分布式全文搜索引擎ES的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch(分布式全文搜索引擎)

分布式全文搜索引擎ElasticSearch

分布式全文搜索引擎ElasticSearch—超详细

全文搜索之MySQL与ElasticSearch搜索引擎

es深入搜索之全文检索

Elasticsearch构建全文搜索系统