Elasticsearch的几种查询方式及其参数说明
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elasticsearch的几种查询方式及其参数说明相关的知识,希望对你有一定的参考价值。
参考技术A 查询方式:1、query string search
1.1 GET /索引/类型/_search
其中:
took:耗费时间
timed_out: 是否超时
_shards:数据分片信息
totle:被查询的分片数
successful:成功执行查询的分片数
failed:失败执行查询的分片数
hits.total:查询结果的数量
hits.max_score:对于查询条件的匹配度,分数越高越匹配
hits.hits:所有匹配到的数据
"_index":所在索引
"_type":对应的类型
"_id":主键ID
"_score":匹配分数
"_source":数据资源
1.2 GET /索引/类型/_search?q=field:xxx&sort=field:desc
查询语句说明:
q代表查询条件,q等于键值对
sort代表排序,field代表字段,desc代表排序方式
2 query DSL(Domain Specified Language)
2.1 GET /索引/类型/_search
"query": // 查询条件
"match": // 改为match_all 查全部
"field": "XXX"
,
“_source”: [ "field1", "field2" ], // 指定结果列
"hightlight": // 查询结果高亮显示
"pre_tags" : "<p class='red'>", // 自定义高亮标签开始
"post_tags" : "</p>", // 自定义高亮标签结尾
"fields": // 要高亮显示的字段
"field": // 实际字段
,
"sort": [ // 排序条件
"parice": "desc"
],
“form”: 1, // 第几页
"size": 2 // 每页几天
3 query filter
GET /索引/类型/_search
“bool”:
"must": // 必须匹配
"match":
"field": "XXX"
,
"filter": // 筛选
"range": // 范围
"field": "gt": "22" // gt代表大于
4 full-text search 全文检索
GET /索引/类型/_search
“query”:
"match": "field": "XXX OOOO" // 查询匹配全文中的field字段,包含OOOO和XXX的数据信息,其中包含XXX OOOO的数据的_score分数最高,匹配度最高,原理为,数据进入时会将field字段的内容进行分词,然后根据分出来的每个词去匹配
5 phrase search (短语搜索)
GET /索引/类型/_search
“query”:
"macth_phrase" : // 只匹配XXX OOOO这个短句,而全文检索是除此之外,还会将包含XXX和包含OOOO的也都匹配出来
"field": "XXX OOOO"
ElasticSearch第5天 es实现分页查询的几种方式
参考技术A es实现分页查询,在ES中有三种方式可以实现分页:from+size、scroll、search_after这种分页方式虽然查询变快了,但滚动上下文代价很高,每一个 scroll_id 不仅会占用大量的资源(特别是排序的请求),而且是生成的历史快照,对于数据的变更不会反映到快照上,那么在实时情况下如果处理深度分页的问题呢?es 给出了 search_after 的方式,这是在 >= 5.0 版本才提供的功能。
searchAfter的方式通过维护一个实时游标来避免scroll的缺点,它可以用于实时请求和高并发场景。
search_after的理念是,=在不同分片上(假设有5个分片),先按照指定顺序排好,根据我们传的search_after值 ,然后仅取这个值之后的size个文档。这 5*size 个文档拿到Es内存中排序后,返回前size个文档即可。避免了浅分页导致的内存爆炸情况,经实际使用性能良好,ES空闲状态下查询耗时稳定在50ms以内,平均10~20ms。
ElasticSearch之Search_After的注意事项
1.搜索时,需要指定sort,并且保证值是唯一的(可以通过加入_id或者文档body中的业务唯一值来保证);
2.再次查询时,使用上一次最后一个文档的sort值作为search_after的值来进行查询;
3.不能使用随机跳页,只能是下一页或者小范围的跳页(一次查询出小范围内各个页数,利用缓存等技术,来实现小范围分页,比较麻烦,比如从第一页调到第五页,则依次查询出2,3,4页的数据,利用每一次最后一个文档的sort值进行下一轮查询,客户端或服务端都可以进行,如果跳的比较多,则可能该方法并不适用)
它与滚动API非常相似,但与它不同,search_after参数是无状态的,它始终针对最新版本的搜索器进行解析。因此,排序顺序可能会在步行期间发生变化,具体取决于索引的更新和删除
from+ size 分页,如果数据量不大或者from、size不大的情况下,效率还是蛮高的。但是在深度分页的情况下,这种使用方式效率是非常低的,并发一旦过大,还有可能直接拖垮整个ElasticSearch的集群。
scroll 分页通常不会用在客户端,因为每一个 scroll_id 都会占用大量的资源,一般是后台用于全量读取数据使用
search_after通过维护一个实时游标来避免scroll的缺点,它可以用于实时请求和高并发场景,一般用于客户端的分页查询
大体而言就是在这三种分页方式中,from + size不适合数据量很大的场景,scroll不适合实时场景,而search after在es5.x版本之后应运而生,较好的解决了这个问题。
以上是关于Elasticsearch的几种查询方式及其参数说明的主要内容,如果未能解决你的问题,请参考以下文章