es全文检索java源码_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 依赖

org.elasticsearch

elasticsearch

2.4.0

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-搜索-原理

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

1561197225722333.png

ElasticSearch-查询-query

查询:query

分页:from/size

排序:sort

过滤:filter

按查询匹配度排序

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

ElasticSearch-aggregations

统计:aggregations

根据字段进行分组统计

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

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

ElasticSearch-aggregations-实例一:

统计相同年龄学员个数

1561197362336513.png

ElasticSearch-aggregations-实例二:

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

1561197514197088.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值