部分匹配的较短字段优先于完全匹配的较大字段

时间:2017-11-21 10:11:17

标签: elasticsearch

我在索引中有两个字段,我要查询它。一个是标题,另一个是内容。 内容是一个很大的领域,包含文章的全部内容。 两个字段都具有相同的分析器,min_gram为3,max_gram为20。

现在问题是当我搜索一个术语并且该术语完全匹配内容字段并且部分匹配标题字段时,标题字段优先。

例如,我正在搜索一个名为 hacking 的术语。 现在有一个在其内容字段中包含黑客的文档。还有多个文档,其标题包含跟踪(无论如何都不是黑客攻击)。

但是,当我使用黑客进行查询时,所有跟踪结果都排在首位,黑客攻击位于结果的第三或第四页。这不是我所期望的。黑客攻击结果应该是最重要的。当我检查得分时,跟踪为标题的那个获得0.6作为分数,而一个有内容黑客攻击得分为0.08,即使我已经查询了Hacking。

我的查询看起来像这样

{
  "query": {
    "multi_match" : {
      "query": "hacking", 
      "fields": ["title", "content"] 
    }
  }
}

据我所知,短场总得分更高。但这不是预期的。

请帮助解决此问题。 我通过提升更大的领域来尝试它,但结果并不令人满意。 无论在哪个字段中存在完全匹配都不能得到第一个优先级,然后在搜索结果中会出现部分匹配?

1 个答案:

答案 0 :(得分:1)

以下应该做你想做的事

{
  "query": {
    "bool": {
      "should": [
        {
          "multi_match": {
            "query": "hacking",
            "fields": [
              "title",
              "content"
            ],
            "minimum_should_match": "75%",
            "type": "most_fields"
          }
        },
        {
          "multi_match": {
            "query": "hacking",
            "fields": [
              "title",
              "content"
            ],
            "type": "phrase",
            "slop": 1
          }
        }
      ]
    }
  }
}

请注意,minimum_should_match值会添加到第一个搜索组件中。如果要实际排除没有一定匹配量的结果,请将其保留在查询中。您也可以删除它,而不会对搜索的第二部分产生任何影响。

搜索的第二部分是基于短语的查询,它将提高匹配接近精确的分数。 slop值确定匹配所需的匹配精确度,0是完全匹配。

尝试使用此搜索并调整此处定义的某些值,您应该得到所需的结果。