Boosting query、Boolean query

Boosting query

返回与positive匹配的文档,同时减少与negative查询匹配的文档的相关性得分。

可以使用boosting 查询降级某些文档,而不将它们从搜索结果中排除。

GET /_search
{
  "query": {
    "boosting": {
      "positive": {
        "term": {
          "text": "apple"
        }
      },
      "negative": {
        "term": {
          "text": "pie tart fruit crumble tree"
        }
      },
      "negative_boost": 0.5
    }
  }
}

positive

(不能为空)您希望运行的查询。任何返回的文档都必须匹配此查询。

nagative

(不能为空)用来降低匹配到的文档的相关性得分的查询。

如果返回的文档匹配positive查询和此查询,boosting查询将计算该文档的最终相关性得分,如下所示:

从positive查询中取原始的相关性分数,将分数乘以negative_boost值。

negative_boost

(Required, float) 0到1.0之间的浮点数,用于降低与negative查询匹配的文档的相关性得分。

例如上面例子:

positive:查询“text”字段中,所有包含“apple”的文档。

negative:查询“text”字段中,所有包含“pie tart fruit crumble tree”的文档。

当返回结果后,同时匹配positive和negative的文档得分=positive部分的原始得分*0.5

通过这种方法,可以对查询结果进行排序,降低我们指定内容的得分。

Boolean query

1、bool子句组成:

bool查询映射到Lucene BooleanQuery。它是使用一个或多个布尔子句构建的,每个子句都有一个类型发生。发生类型为:

  • must:返回的文档必须满足must子句的条件,并且参与计算分值。
  • filter:根据filter条件,过滤掉返回的文档,不参与分值计算。
  • should:返回可能包含查询条件的文档。并且当有多个should时,只要有一个should子句条件满足,就会返回对应的结果。
  • must_not:满足子句中条件的记录将不返回。

 bool查询采用了“更多匹配即更好”的方法,因此每个匹配的must或should子句的得分将被加在一起,以提供每个文档的最终_score。

2、使用minimum_should_match

可以使用minimum_should_match参数指定返回的文档必须匹配的should子句的数量或百分比。

如果bool查询至少包含一个should子句,没有must或filter子句,则默认值为1。否则,默认值为0。

3、 bool.filter子句对分数的影响

filter子句下指定的查询对评分没有影响。分数只受指定的查询的影响。例如,以下三个查询都返回status字段包含术语active的所有文档。

1)第一个查询为所有文档分配0分,因为没有指定评分查询:

GET _search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

2)这个bool查询有一个match_all查询,它为所有文档分配1.0分。

GET _search
{
  "query": {
    "bool": {
      "must": {
        "match_all": {}
      },
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

3)这个constant_score查询的行为与上面第二个例子完全相同。constant_score查询为过滤器匹配的所有文档分配1.0分。

GET _search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "status": "active"
        }
      }
    }
  }
}

4、给查询取名

每个查询在其顶级定义中接受一个_name。您可以使用命名查询来跟踪哪些查询与返回的文档匹配。如果使用命名查询,则响应为每次命中包含matched_queries属性。

GET /_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "name.first": { "query": "shay", "_name": "first" } } },
        { "match": { "name.last": { "query": "banon", "_name": "last" } } }
      ],
      "filter": {
        "terms": {
          "name.last": [ "banon", "kimchy" ],
          "_name": "test"
        }
      }
    }
  }
}

 

posted @ 2022-10-26 15:28  水果小虫  阅读(100)  评论(0)    收藏  举报