当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch:具有多个字段的单个"more like-this"查询vs具有单个字段的多个"more like-this"查询

呼延子安
2023-03-14

Elasticsearch允许通过其“more like this”(MLT)查询搜索类似文档。我正试图更好地理解和调整查询,以便更好地找到类似的文档。

在试验它时,我发现具有多个字段的单个MLT查询的结果与具有每个字段的多个MLT查询的布尔值产生不同的结果。以下样本(截断):

具有多个字段的单个MLT查询

es.search(index=INDEX_NAME, body = {'query': {
    "more_like_this" : {
        "fields" : ['title', 'category_name', 'brand'],
        "like" : []
        }
    }
})

具有单个字段的多个MLT查询

es.search(index=INDEX_NAME, body = {'query': {
    'bool': {
                'should': [
                    {'more_like_this' : {
                    'fields' : ['title'],
                    'like' : [],
                    }},

                    {'more_like_this' : {
                    'fields' : ['category_name'],
                    'like' : [],
                    }},

                    {'more_like_this' : {
                    'fields' : ['brand'],
                    'like' : [],
                    }},
                ]
            }
    }
})

为什么会发生这种情况?

我知道MLT查询会将单个查询中列出的所有字段中的文本组合在一起,以搜索文档。但是,标题、类别名称和品牌字段中的文本没有重叠。因此,结果应该是相同的。但是,结果是不同的——顺便说一句,多个MLT查询工作得更好。

如果这个问题没有直接的解决办法,我道歉。我希望elastic专家能够更好地理解如何改进返回的查询。

如果你有时间的话,我在MLT上发布了一个尚未回答的问题:Elasticsearch“more_like_this”查询特定于字段

共有1个答案

仉昱
2023-03-14

如果我理解正确的话,在两种不同的情况下,规范化过程发生在字段内部,而不是字段之间。分数通过字段字符串的长度、出现次数等进行标准化。如果这在字段之间差异很大,那么您不会期望两个查询的结果是相同的。

 类似资料:
  • 尝试获取与字段ABC的值相匹配的文档。尝试了“必须”或“应该”查询,但未得到预期结果。有人能建议我应该尝试什么样的查询吗?使用HighLevelRestClient。 或 映射 条件工作正常。如果我只是反转条件并忽略字段值,那么我就会得到结果。 X1和Y1是精确的字段值(想想枚举) Still query返回所有文档。这应该已将文档筛选为匹配的值 样本文档

  • 问题内容: 我有一个包含三个字段(所有字符串类型)的“报告”对象列表- 我有一个排序代码,就像 由于某种原因,我没有排序顺序。一个建议在字段之间放置空格,但是为什么呢? 你认为代码有什么问题吗? 问题答案: 你认为代码有什么问题吗? 是。为什么在比较它们之前将三个字段加在一起? 我可能会做这样的事情:(假设字段按照你希望对其进行排序的顺序)

  • 问题内容: 我有一个具有唯一的数字运行ID的文档集合,我想找到运行ID最高的文档。 我可以做两个查询。 首先,我可以找到最高的运行ID: 其次,我可以找到具有该运行ID的文档: 有没有办法我可以通过一个查询做到这一点? 问题答案: 您可以通过组合“ sort”和“ size”来实现: 这将返回最高的记录

  • 我在谷歌周围看了一段时间,但没有工作。有谁能帮我解决这个问题吗?

  • 问题内容: 我基本上只是试图更新表中的多个值。最好的方法是什么?这是当前代码: 我要包含的另一个更新是: 谢谢! 问题答案: 用逗号分隔添加多列: 但是,您没有在清理输入内容??这意味着任何随机的黑客都可能破坏您的数据库。看到这个问题:用PHP清理用户输入的最佳方法是什么? 另外,样式是数字还是字符串?我假设一个字符串,所以需要用引号引起来。

  • 问题内容: 我是ES的新手,我正在尝试建立一个查询,该查询将对多个字段使用phrase_prefix,因此我不必进行多次搜索。 这是到目前为止我得到的: 有人知道如何搜索多个字段,例如“ last_name”吗? 问题答案: 您正在使用的文本查询已被弃用(有效重命名),而改为使用match query 。匹配查询支持单个字段,但是您可以使用multi_match查询,该查询支持完全相同的选项并允许