11.Elasticsearch查询关键字2

阅读: 评论:0

11.Elasticsearch查询关键字2

11.Elasticsearch查询关键字2

本文主要讲解组和查询使用的关键字
  • bool
  • must
  • must_not
  • should
  • filter
  • constant_score
    在很多时候,我们不仅仅是根据id来查询某条记录或者某个文档,我们需要进行一系列的筛选和过滤,此时,我们需要把各种条件组和起来,成为一条语句去执行,本文,就是讲如何处理此问题。
    目录:
  • 1.使用bool组和查询条件
  • 2.相关性得分计算方式
  • 3.filter过滤查询

1.使用bool组和查询条件

bool可以连接组和一下几个参数条件:
- must:文档必须匹配这些条件才可以被筛选出来。
- must_not:文档必须不匹配这些条件才可以被筛选出来。
- should:如果满足这些语句中的任意语句,将增加 _score ,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
- filter:必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。

2.相关性得分计算方式

每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。
由于这是我们看到的第一个包含多个查询的查询,所以有必要讨论一下相关性得分是如何组合的。每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。

下面的查询用于查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果 两者 都满足,那么它排名将更高:

{"bool": {"must":     { "match": { "title": "how to make millions" }},"must_not": { "match": { "tag":   "spam" }},"should": [{ "match": { "tag": "starred" }},{ "range": { "date": { "gte": "2014-01-01" }}}]}
}
注意:如果没有 must 语句,那么至少需要能够匹配其中的一条 should 语句。但,如果存在至少一条 must 语句,则对 should 语句的匹配没有要求。

3.filter过滤查询

在上面的查询中,如果我们不想因为date这个字段来影响得分,我们可以用filter语句来重写:

{"bool": {"must":     { "match": { "title": "how to make millions" }},"must_not": { "match": { "tag":   "spam" }},"should": [{ "match": { "tag": "starred" }}],"filter": {"range": { "date": { "gte": "2014-01-01" }} }}
}

我们把date的条件转移到了filter中,这样,这个date就不会影响评分和相关性排名了,这样可以优化查询性能。

所有查询都可以借鉴这种方式。将查询移到 bool 查询的 filter 语句中,这样它就自动的转成一个不评分的 filter 了。

如果你需要通过多个不同的标准来过滤你的文档,bool 查询本身也可以被用做不评分的查询。简单地将它放置到 filter 语句中并在内部构建布尔逻辑:

{"bool": {"must":     { "match": { "title": "how to make millions" }},"must_not": { "match": { "tag":   "spam" }},"should": [{ "match": { "tag": "starred" }}],"filter": {"bool": { "must": [{ "range": { "date": { "gte": "2014-01-01" }}},{ "range": { "price": { "lte": 29.99 }}}],"must_not": [{ "term": { "category": "ebooks" }}]}}}
}

4.constant_score 查询

constant_score 查询,它是将一个不变的常量评分应用于所有匹配的文档,经常用于:只执行一个filter而没有其他查询。
可以使用它来取代只有 filter 语句的 bool 查询。在性能上是完全相同的,但对于提高查询简洁性和清晰度有很大帮助。

{"constant_score":   {"filter": {"term": { "category": "ebooks" } }}
}

term 查询被放置在 constant_score 中,转成不评分的 filter。这种方式可以用来取代只有 filter 语句的 bool 查询。

下一篇:12.Elasticsearch查询关键字3

本文发布于:2024-02-02 08:47:25,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170683484842670.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23