Elasticsearch - 使用不同的术语查询主要和次要属性

时间:2018-04-02 18:54:05

标签: elasticsearch solr lucene

我正在使用elasticsearch来查询最初从具有大量冗余的几个关系数据库中导出的数据。我现在想要执行查询,其中我有一个主要属性和一个或多个应该匹配的辅助属性。我尝试使用一个必须术语和一个术语的bool查询,但这似乎不适用于我的情况,可能如下所示:

示例:

我有一个用户fullnamestreet name的文档,我想搜索不同索引中的类似用户。因此,我的查询的最佳匹配应该是fullname上的最佳匹配和streetname字段上的最佳匹配。但由于原始数据有很多冗余和不一致,因此字段fullname(我手动创建的字段name1,name2,name3)可能多次包含相同的名称,而且似乎elasticsearch排名为双重匹配必须字段高于should属性中的匹配项。

这意味着,我想使用以下示例数据查询John Doe Back Street

{
    "fullname" : "John Doe John and Jane",
    "street" : "Main Street"

}
{
    "fullname" : "John Doe",
    "street" : "Back Street"

}

长话短说,我想查询主要属性fullname - John Doe和辅助属性street - Back Street,并希望第二个文档是最佳匹配而不是第一个,因为它包含John多次。

1 个答案:

答案 0 :(得分:1)

在Elasticsearch中操纵相关性并不是最容易的部分。分数计算基于三个主要部分:

  • 学期频率
  • 反向文档频率
  • 场长规范

很快:

  • 通常该字词出现在字段中,更相关的是
  • 通常该术语出现在整个索引中,LESS相关的是
  • 该术语越长,则更相关的是

我建议你阅读以下材料:

一般来说,在您的情况下,fullname的结果比street更重要,您可以提高第一个的重要性。下面是我的工作代码示例代码:

{
  "query": {
    "multi_match": {
      "query": "john doe",
      "fields": [
        "fullname^10",
        "street"
      ]
    }
  }
}

在此示例中,fullname的结果比^10的结果重十倍(street)。您可以尝试操纵增强或使用其他方式来控制相关性,但正如我在开始时提到的 - 它不是最简单的方法,一切都取决于您的具体情况。主要是因为“反向文档频率”部分考虑了整个索引中的术语 - 每个下一个添加到索引的文档都可能会改变相同搜索查询的得分。

我知道我没有直接回答,但我希望能帮助你理解这是如何运作的。