ElasticSearch全文检索__ElasticSearch Java API
ElasticSearch-Java Client类型
Node Client
1) 客户端节点本身也是ElasticSearch节点
2)也进入集群,和其他ElasticSearch节点一样
3)升级维护麻烦(词库、配置等等)
https://www.elastic.co/guide/en/elasticsearch/client/java-api/2.2/index.html
TransportClient
1)更加轻量级
2)客户端socket连接到es集群
3)早期版本需要完全一致
ElasticSearch-TransportClient环境准备
Eclipse 开发工具
添加Maven 依赖
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>2.4.0</version>
</dependency>
ElasticSearch-TransportClient连接
TransportClient 测试连接ES集群
client.transport.sniff嗅探功能
TransportClient 生成环境连接ES集群
ElasticSearch-Document APIs
Index API
Get API
Delete API
Delete By Query API
Update API
Multi Get API
Bulk API
Using Bulk Processor
ElasticSearch-搜索-原理
ElasticSearch-搜索-问题
返回数据数量问题
如果数据分散在默认的5个分片上,ES会向5个分片同时发出请求,每个分片都返回10条数据,最终会返回总数据为:5*10=50条数据,远远大于用户请求
返回数据排名问题
每个分片计算符合条件的前10条数据都是基于自己分片的数据进行打分计算的。计算分值(score)使用的词频和文档频率等信息都是基于自己分片的数据进行的,而ES进行整体排名是基于每个分片计算后的分值进行排序的(打分依据就不一致,最终对这些数据统一排名的时候就不准确了)
ElasticSearch-搜索-问题解决思路
返回数据数量问题:
第一步:先从每个分片汇总查询的数据id,进行排名,取前10条数据
第二步:根据这10条数据id,到不同分片获取数据
返回数据排名问题:
将各个分片打分标准统一;
ElasticSearch-搜索-SearchType-类型一
query and fetch
向索引的所有分片(shard)都发出查询请求,各分片返回的时候把元素文档(document)和计算后的排名信息一起返回。
优点:
这种搜索方式是最快的。因为相比后面的几种搜索方式,这种查询方法只需要去shard查询一次。
缺点:
各个shard返回的结果的数量之和可能是用户要求的size的n倍。
https://www.elastic.co/guide/en/elasticsearch/reference/2.4/search-request-search-type.html
ElasticSearch-搜索-SearchType-类型二
query then fetch(es默认的搜索方式)
实现原理:
第一步,先向所有的shard发出请求,各分片只返回文档id(注意,不包括文档document)和排名相关的信息(也就是文档对应的分值),然后按照各分片返回的文档的分数进行重新排序和排名,取前size个文档。
第二步,根据文档id去相关的shard取document。这种方式返回的document数量与用户要求的大小是相等的。
优点:
返回的数据量是准确的。
缺点:
数据排名不准确且性能一般。
ElasticSearch-搜索-SearchType-类型三
DFS query and fetch
这种方式比第一种类型多了一个DFS步骤,它可以更精确控制搜索打分和排名。
实现原理:
第一步:先对所有分片发送请求,把所有分片中的词频和文档频率等打分依据全部汇总到一块。
第二步:然后再执行后面的操作后续操作
优点:
数据排名准确。
缺点:
搜索性能一般,且返回的数据量不准确,可能返回(N*分片数量)的数据。
ElasticSearch-搜索-SearchType-类型四
DFS query then fetch
比第2种方式多了一个DFS步骤。
实现原理:
第一步:先对所有分片发送请求,把所有分片中的词频和文档频率等打分依据全部汇总到一块。
第二步:然后再执行后面的操作后续操作
优点:
返回的数据量是准确的,数据排名也是准确的。
缺点:
性能最差【这个最差只是表示在这四种查询方式中性能最慢,也不至于不能忍受,如果对查询性能要求不是非常高,而对查询准确度要求比较高的时候可以考虑这个】
ElasticSearch-搜索-SearchType-总结
从性能考虑来说,QUERY_AND_FETCH是最快的,DFS_QUERY_THEN_FETCH是最慢的。
从搜索的准确度来说,DFS要比非DFS的准确度更高。
ElasticSearch-搜索-SearchType-示例操作:
ElasticSearch-查询-query
查询:query
分页:from/size
排序:sort
过滤:filter
按查询匹配度排序
高亮显示:highlight(后面结合实例讲解)
ElasticSearch-aggregations
统计:aggregations
根据字段进行分组统计
根据字段分组,统计其他字段的值
size设置为0,会获取所有数据,否则,默认只会返回前10个分组的数据
ElasticSearch-aggregations-实例一:
统计相同年龄学员个数
ElasticSearch-aggregations-实例二:
ElasticSearch-分页
SQL 语句分页:limit m,n:
m:从哪条结果开始
n:size:每次返回多少个结果
Elasticsearch使用的是from以及size两个参数:
from:从哪条结果开始,默认值为0
size:每次返回多少个结果,默认值为10
假设每页显示5条结果,那么1至3页的请求就是:
GET /_search?size=5
GET /_search?size=5&from=5
GET /_search?size=5&from=10
注意
不要一次请求过多或者页码过大的结果,这么会对服务器造成很大的压力。因为它们会在返回前排序。一个请求会经过多个分片。每个分片都会生成自己的排序结果。然后再进行集中整理,以确保最终结果的正确性。
ElasticSearch-分页-实例
ElasticSearch-支持多索引和多类型查询
ElasticSearch-分片查询方式
randomizeacross shards:随机选择分片查询数据,es的默认方式
_local:优先在本地节点有的分片中查询,没有的话再在其它节点查询。
_only_local:只在本地节点有的分片中查询。
_primary:只在主分片中查询。
_replica:只在副本中查询。
_primary_first:优先在主分片中查询,然后在副本中查询。
_replica_first:优先在副本中查询,然后在主分片中查询。
_only_node:只在指定id的节点里面进行查询。
_prefer_node:优先在指定的节点上执行查询。
_shards:查询指定分片的数据
ElasticSearch-极速查询
Es将数据存储在不同的分片中,根据文档id通过内部算法得出要将文档存储在哪个分片上,所以在查询时只要指定在对应的分片上进行查询就可以实现基于es的极速查询。
知道数据在那个分片上,是解决问题的关键。
实现方式:我们可以通过路由参数来设置数据存储在同一个分片中,setRouting("") org.elasticsearch.cluster.routing
- 点赞
- 收藏
- 关注作者
评论(0)