Elasticsearch2.x 全文检索之——查询合并

查询合并(Combining Queries)

在Combining Filters这一节我们讨论了在布尔过滤器中如何通过and/or/not逻辑来合并多个过滤子句(filte clauses),在查询中bool query跟bool filter是类似的除了一点。
在filter中它做的是一个yes/no的过滤:表示当前文档是否符合过滤条件(是否应该包含在结果集中),其结果只能是yes或no
在query中它不仅决定了文档是否包含在结果集中,同时也包含了该文档与查询文本的相似度评分

和bool filter一样bool query也通过must、must_not、should参数来组合多个查询子句(query clause),如下:
GET /my_index/my_type/_search
{
  "query": {
    "bool": {
      "must":     { "match": { "title": "quick" }},
      "must_not": { "match": { "title": "lazy"  }},
      "should": [
                  { "match": { "title": "brown" }},
                  { "match": { "title": "dog"   }}
      ]
    }
  }
}
上面的查询中会返回那些title字段中包含了“quick”同时不包含“lazy”的文档,到这里目前这个逻辑和filter是相似的。接下来两个should子句就和bool filter中有很大不同了,它代表的含义是:如果文档中title字段不要求包含“brown”和“dog”,但是如果包含了这两个词,那么会使搜索结果的文档打分更高(也就是和我们的查询意图跟相关)

下面是查询结果:
{
  "hits": [
     {
        "_id":      "3",
        "_score":   0.70134366, 
        "_source": {
           "title": "The quick brown fox jumps over the quick dog"
        }
     },
     {
        "_id":      "1",
        "_score":   0.3312608,
        "_source": {
           "title": "The quick brown fox"
        }
     }
  ]
}
文档3的得分比文档1高的原因是,在文档3中title同时包含了“brown”和“dog”两个词

得分计算(重要)

在bool query中,文档的相关度_score的计算是通过bool query中所有的“must”和“should”参数指定的查询子句(query caluse)的得分除以所有的“must”和“should”子句个数和。
在bool query中must_not参数指定的查询子句是不影响文档最终得分的,它唯一的作用就是排除掉那些不符合条件的文档。


精度控制

在bool query中,“must”参数指定的查询子句是必须匹配的,“must_not”参数指定的查询子句是必须匹配的,那么“should”参数指定的查询子句需要匹配多少呢?默认情况下should子句一个都不匹配只要文档满足了上面的must和must_not子句也是会返回的,只是得分会低一点。还有一种极端情况是:如果在bool query中只指定了should子句,那么至少匹配一个子句该文档才会被返回。
和控制match query的匹配精度一样,我们可以通过minimum_should_match参数来控制should子句的匹配精度,可以指定一个正整数或者一个百分比,比如:
GET /my_index/my_type/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title": "brown" }},
        { "match": { "title": "fox"   }},
        { "match": { "title": "dog"   }}
      ],
      "minimum_should_match": 2 
    }
  }
}
上面的bool查询表示should参数中指定的3个查询子句至少匹配2个(也可以指定66.66%),也就是说查询结果中文档的title字段必须是包含“brown”和“dog”或者“brown”和“fox”或者“dog”和“fox”,如果一个文档同时包含了这3个词,那么它的相关度会更高。





posted @ 2016-10-06 21:43  陈楠同学  阅读(1265)  评论(0编辑  收藏  举报