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的几种查询方式及其参数说明的主要内容,如果未能解决你的问题,请参考以下文章

Vue 之 路由常用的几种传参方式

Redis常见的几种使用方式及其优缺点

spring实现aop的几种方式及其适用场合

react创建组件的几种方式及其区别

字符串带参拼接的几种思路总结

Python 实现栈的几种方式及其优劣