Elasticsearch:单个“更喜欢这个”查询,包含多个字段与多个“更喜欢这个”查询,包含单个字段

时间:2016-09-23 09:11:48

标签: python elasticsearch

Elasticsearch允许通过“更喜欢这个”(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查询会将单个查询中列出的所有字段中的文本组合在一起搜索文档。但是,标题,category_name和品牌字段中的文本没有重叠。因此,结果 应该相同。但是,结果是不同的 - 多个MLT查询工作得更好btw。

如果这个问题没有直接解决方案我很抱歉。我正在寻求弹性大师对如何改进返回查询的更多理解。

如果你有时间,这是我在MLT上发布的上一个问题仍未得到答复:Elasticsearch "more_like_this" query specific to fields

1 个答案:

答案 0 :(得分:0)

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