分布式全文搜索引擎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:ES对Java提供一套操作索引库的工具包,即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的主要内容,如果未能解决你的问题,请参考以下文章