不同单词的匹配应该高于弹性搜索中一个单词的多个匹配

时间:2016-01-06 11:23:13

标签: elasticsearch tagging

在我们的弹性搜索中,我们已经为某些人编制索引,其中每个人都可以拥有多个标签。

例如2人(全名 - (标签)):

  1. 巴特纽曼 - (巴特,工程师,首席执行官)
  2. Bart Holland - (开发商,雇主)
  3. 我们的搜索查询

    {
      "multi_match": {
        "type": "most_fields",
        "query": "bart developer",
        "operator": "or",
        "boost": 5,
        "fields": [
          "fullname^5",
          "taggings.tag.name^5"
        ],
        "fuzziness": 0
      }
    }
    

    我们正在搜索" bart开发者"。那么我们应该期待Bart Holland应该来到Bart Newman之前,但是因为Bart Newman的全名 bart bart 作为标签,他的得分高于Bart Holland。

    有没有办法我可以配置不同单词匹配( bart 开发者)得分高于一个单词的多个匹配( bart < /强>)。

    我已经尝试了 -operator但没有成功。

    谢谢!

1 个答案:

答案 0 :(得分:2)

这是most fields查询所期望的,它是以字段为中心的而不是以术语为中心的,来自文档

  

most_fields以字段为中心而非以术语为中心:它寻找   最匹配的领域,当我们真正感兴趣的是   最匹配的术语。

另一个问题是Inverse Document Frequency,这也是你的情况。我想只有少数几个文件的标签名为bart,这就是为什么它的IDF非常高,因此得分更高。

如上述链接所示,您应该看到如何使用validateexplain对文档进行评分。

有几种方法可以解决这个问题

1)您可以使用custom _all字段,即将full nametag信息复制到包含copy_to参数的新字段,然后查询,但您必须{ {1}}您的数据

2)我认为更好的解决方案是使用cross fields,需要reindex方法。来自文档

  

cross_fields类型首先分析查询字符串以生成a   术语列表,然后在任何字段中搜索每个术语。

它还通过在所有字段中混合来解决term-centric问题。

这可以解决您的问题。

IDF

希望这有帮助!