ElasticSearch组合多查询(must, should, must_not, filter)
举个例子
if (StringUtils.isNotEmpty(goodsSpu.getCategoryId())){ filterBuilder.must(QueryBuilders.wildcardQuery("categoryId", "*"+goodsSpu.getCategoryId()+"*")); }
1.must
文档 必须 匹配这些条件才能被包含进来。 相当于sql中的 and
2.must_not
文档 必须不 匹配这些条件才能被包含进来。 相当于sql中的 not
3.should
如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。 相当于sql中的or
4.filter
必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
每一个子查询都独自地计算文档的相关性得分。
Es查询语句提升权重,boost关键词
一个简单得bool查询
GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": "Elasticsearch" }}, { "match": { "content": "Lucene" }} ] } } }
1. content
字段必须包含 full
、 text
和 search
所有三个词。
2. 如果 content
字段也包含 Elasticsearch
或 Lucene
,文档会获得更高的评分 _score
。
3. hould
语句匹配得越多表示文档的相关度越高
让包含 Lucene
的有更高的权重,并且包含 Elasticsearch
的语句比 Lucene
的权重更高
GET /_search { "query": { "bool": { "must": { "match": { "content": { "query": "full text search", "operator": "and" } } }, "should": [ { "match": { "content": { "query": "Elasticsearch", "boost": 3 } }}, { "match": { "content": { "query": "Lucene", "boost": 2 } }} ] } } }
1. 这些语句使用默认的 boost
值 1
。
2. 这条语句更为重要,因为它有最高的 boost
值。
3. 这条语句比使用默认值的更重要,但它的重要性不及 Elasticsearch
语句。
4. boost
参数被用来提升一个语句的相对权重( boost
值大于 1
)或降低相对权重( boost
值处于 0
到 1
之间),但是这种提升或降低并不是线性的,换句话说,如果一个 boost
值为 2
,并不能获得两倍的评分 _score
。
5. 相反,新的评分 _score
会在应用权重提升之后被 归一化 ,每种类型的查询都有自己的归一算法,简单的说,更高的 boost
值为我们带来更高的评分 _score
。
6. 如果不基于 TF/IDF 要实现自己的评分模型,我们就需要对权重提升的过程能有更多控制,可以使用 function_score
查询操纵一个文档的权重提升方式而跳过归一化这一步骤。
标签:语句,content,should,filter,文档,query,boost,must From: https://www.cnblogs.com/cgy-home/p/17391245.html