ElasticSearch全文检索__ElasticSearch Java API

举报
Smy1121 发表于 2019/06/22 18:00:08 2019/06/22
【摘要】 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-搜索-原理

image.png


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-示例操作:

image.png


ElasticSearch-查询-query

查询:query

分页:from/size

排序:sort

过滤:filter

按查询匹配度排序

高亮显示:highlight(后面结合实例讲解)



ElasticSearch-aggregations

统计:aggregations

根据字段进行分组统计

根据字段分组,统计其他字段的值

size设置为0,会获取所有数据,否则,默认只会返回前10个分组的数据



ElasticSearch-aggregations-实例一:

统计相同年龄学员个数

image.png


ElasticSearch-aggregations-实例二:

image.png


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-支持多索引和多类型查询

image.png


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

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。