Es一般设置默认最大查询是1w条数据,有两种方法可修改查询条数, 第一种修改配置,第二种通过scroll_id 分页查询

项目使用的是elastica库

https://www.csdn.net/tags/OtTaIg5sODcyNzItYmxvZwO0O0OO0O0O.html
https://elastica.io/

查询条数

要添加from,和size, 否则默认查询出的数据要比实际存在的数据少

默认es只能查询10000条数据

es的默认分页机制是会把前面的分页内容也会存在内存里面,比如目前设置的最大值是1w,每页的数量时1w, 当想拿第二页的数据时,es也会把第一页的数据存在内容里,这样就会超过 1w的限制,就会报错Result window is too large, from + size must be less than or equal to: [10000] …

分页实现

方案1:

可以通过修改配置改变ES默认深度分页的index.max_result_window 最大窗口值
curl -XPUT http://127.0.0.1:9200/my_index/_settings -d ‘{ "index" : { "max_result_window" : 500000}}’
这种会方案增加内存消耗,但是较为简便

方案2:

通过scroll_id
通过scroll的查询api http://127.0.0.1:9200/free_chat/_search?scroll=1m 来获取到scroll_id
scroll=1m表示scroll_id有效时间1分钟
上面这个url其实就是第一页的数据,
第二页:http://127.0.0.1:9200/_search/scroll?scroll=1m&scroll_id=DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAEQgWcVBKai0tN3RSTUszdmQ0UHdlTTJfdw==
通过这种方式实现分页,
这种方案:scroll_id会过期,无法走上一页

复合查询

// createBoolQuery 创建复合查询

// addMust 必须满足的条件 类似sql里的and

//addShould 满足其中之一即可 类似sql的 or

查询的类型

match

match是模糊匹配查询,根据分词器(如果创建mapping没有指定分词器,Es将会采取默认的分词器:standard,standard分词将会把匹配的词组分成单个的字,而不是短语)将指定的query查询的语句进行分词匹配。

match_pharse

match_pharse属于短语匹配,要求查询的词句和匹配的短语顺序必须一致,并且是连续的,但可以设置 slop 值来指定查询项之间可以分隔多远的距离

fuzzy

fuzzy查询的时候,不会根据分词器匹配,只会进行拆分,比如查询的是"海zei王",在分词器下(也就是match中)是无法匹配到单个词的,因为它不是一个短语,但是在fuzzy中是可以匹配的,并且fuzzy支持模糊和一定的容错查询匹配,因为它做的是匹配词的拆分,并不是短语。

multi_match

多字段匹配,比如在查询test这个值的时候我们不仅需要在A这个字段中查询,同时它也有可能存在B中,按照普通的写法你可能需要写两次查询,但是使用了multi_search只需要指定具体的fields就可以实现多字段查询

regexp

正则表达式匹配,该匹配模式下我们可以按照正则表达式的符号去匹配具体的值,比如name字段,可以包含有.和去正则匹配具体的值,?表示任一字符,表示所有字符,还有其他的正则符号都可以使用

wildcard

通配符匹配,wildcard和regexp类似,不过它们也有不同之处。regexp的实际匹配能力要大于wildcard,在进行简单的匹配时候,比如名字的*或者?的简单普通匹配,建议使用wildcard而不是regexp,wildcard的效率要高于regexp,regexp可以实现更为复杂的场景,但是效率低一些,通俗的说wildcard是regexp的简化版本.

数据有但是没查出来是因为分词的影响,需要加上keyword

term

term的英文含义表示是:精确的意思,在term查询中,表示做的是精确查询,整词匹配,不会对所匹配项进行拆分。直接以整词进行匹配,如果能查询到就命中该文档

terms

terms和term的区别就是terms允许匹配多个值,而term只允许匹配一个值,在进行多值匹配的场景中可以使用terms,terms匹配到其中任何一个值就会认为整个文档是匹配的,terms多个值如果多个都匹配会返回所有文档

range

range表示一个区间范围查找,这个范围可以是日期或者数值,ES的range比较灵活和明确,可以指定两个边界是否包含,通过参数include_lower:true 、include_upper:true来控制

By cc

Related Post

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注