(转)elasticsearch 常见几种查询方式
原文:https://zhuanlan.zhihu.com/p/344773076
1.精准查询term
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
1.term单值
字段只有一个值时候,用term关键词查询
![](https://pic1.zhimg.com/80/v2-fad892c0fdc6001f63c7b3d5b1553668_720w.webp)
优化:进一步优化查询,因为是精准查询,不需要查询进行评分计算,只希望对文档进行包括或排除的计算,所以我们会使用 constant_score 查询以非评分模式来执行 term 查询并以一作为统一评分。
![](https://pic1.zhimg.com/80/v2-5ad784e83ab4ae66d5e39e2fe6df5d80_720w.webp)
2.terms多值
字段有一多个值时候,用terms关键词查询,后跟数组
优化同上
3.term多字段
![](https://pic1.zhimg.com/80/v2-78f6b9a3ef37dce5ca9026b6c27dd21c_720w.webp)
2.匹配查询match
区别:match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程,match查询相当于模糊匹配,只包含其中一部分关键词就行
1.match
进行full text search或者exact value(非string字段或not_analyzed的字段),进行匹配
2.match_all
{ "match_all": {}} 匹配所有的, 当不给查询条件时,默认全查
3.multi_match
同时对查询的关键词,多个字段同时进行匹配,即多个字段是AND的关系
![](https://pic1.zhimg.com/80/v2-469c2af5b529b985a9bf8b6c14769cb4_720w.webp)
深入:同时field还支持更为丰富的查询
在在fields中,按brandName(品牌名)、sortName(分类名)、productName(商品名)productKeyword(商品关键字),搜索“牛仔 弹力”关键词,brandName源值、拼音值、关键字值都是100分,sortName源值、拼音值80分,productName源值60分,productKeyword值20分,分值由高到低优先级搜索
![](https://pic4.zhimg.com/80/v2-1b4fba06dcc86e41536e6b7ee4440fdf_720w.webp)
4.match_phrase
match_phrase查询分析文本,并从分析文本中创建短语查询。
类似 match 查询, match_phrase 查询首先将查询字符串解析成一个词项列表,然后对这些词项进行搜索,但只保留那些包含 全部 搜索词项,且 位置与搜索词项相同的文档
![](https://pic4.zhimg.com/80/v2-ddee025af0905eaa4a164cfd97d0991f_720w.webp)
![](https://pic4.zhimg.com/80/v2-13dffb5df484cf473be670bfe6ccb723_720w.webp)
3.bool查询
bool查询包含四种操作符,分别是must,should,must_not,query。它们均是一种数组,数组里面是对应的判断条件
1.must:
必须匹配,与and等价。贡献算分
2.must_not:
必须不匹配,与not等价,常过滤子句用,但不贡献算分
3.should:
选择性匹配,至少满足一条,与 OR 等价。贡献算分
4.filter:
过滤子句,必须匹配,但不贡献算分
4.filter查询
过滤器,会查询对结果进行缓存,不会计算相关度,避免计算分值,执行速度非常快。
filter也常和range范围查询一起结合使用,range范围可供组合的选项
gt : 大于
lt : 小于
gte : 大于等于
lte :小于等于
![](https://pic4.zhimg.com/80/v2-02b3c864b53ac627d322895682b4e8bf_720w.webp)