ElasticSearch代码常用关键词
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 查询操纵一个文档的权重提升方式而跳过归一化这一步骤。

浙公网安备 33010602011771号