我正在使用elasticsearch来查询最初从具有大量冗余的几个关系数据库中导出的数据。我现在想要执行查询,其中我有一个主要属性和一个或多个应该匹配的辅助属性。我尝试使用一个必须术语和一个术语的bool查询,但这似乎不适用于我的情况,可能如下所示:
示例:
我有一个用户fullname
和street 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
多次。
答案 0 :(得分:1)
在Elasticsearch中操纵相关性并不是最容易的部分。分数计算基于三个主要部分:
很快:
我建议你阅读以下材料:
一般来说,在您的情况下,fullname
的结果比street
更重要,您可以提高第一个的重要性。下面是我的工作代码示例代码:
{
"query": {
"multi_match": {
"query": "john doe",
"fields": [
"fullname^10",
"street"
]
}
}
}
在此示例中,fullname
的结果比^10
的结果重十倍(street
)。您可以尝试操纵增强或使用其他方式来控制相关性,但正如我在开始时提到的 - 它不是最简单的方法,一切都取决于您的具体情况。主要是因为“反向文档频率”部分考虑了整个索引中的术语 - 每个下一个添加到索引的文档都可能会改变相同搜索查询的得分。
我知道我没有直接回答,但我希望能帮助你理解这是如何运作的。