Elasticsearch:具有多个字段的单个“更喜欢此”查询与具有单个字段的多个“更喜欢此”查询

Eug*_*Yan 5 python elasticsearch

Elasticsearch允许通过其“更多类似”(MLT)查询来搜索相似文档。我试图更好地理解和调整查询以更好地找到相似的文档。

在进行实验时,我发现来自多个字段的单个MLT查询的结果与每个字段一个的多个MLT查询的布尔值产生不同的结果。以下示例(被截断):

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

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

具有单个字段的多个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' : [],
                    }},
                ]
            }
    }
})
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

我知道MLT查询将合并单个查询中列出的所有字段中的文本以搜索文档。但是,标题,类别名称和品牌字段中的文本没有重叠。因此,结果相同。但是,结果却有所不同-多个MLT查询的效果更好。

如果这个问题没有直接的解决方法,我深表歉意。我希望弹性专家对如何改进返回的查询有更多的了解。

如果有时间,这是我在MLT上发布的上一个问题,但仍未得到解答:Elasticsearch特定于字段的“ more_like_this”查询

Phi*_*zin 0

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