如何在Elasticsearch中查找查询条件更匹配的文档?

时间:2019-06-29 12:19:41

标签: elasticsearch

我正在寻找一种自定义ElasticSearch评分方式,以检索与更多不同查询词匹配的文档。

我的索引映射是:

{
"settings" : {
    "number_of_shards" : 1
},
"mappings" : {
    "properties": {
        "content": {
            "type": "text"
        },
        "display_content": {
            "type": "text"
        }
    }
}

} ''' 我对ElasticSearch的搜索查询是:

{
'from': offset,
'size': size,
'query': {
    'function_score': {
        'boost_mode': 'multiply',
        'score_mode': 'sum',
        'functions': [
        ],
        'query': {
            'bool': {
                'must': {
                    'match': {
                        'content': query
                    }
                 },
                 'filter': [
                     {
                         'term': {
                             'searchable': 'true'
                         }
                     }
                 ]
             }
        }
    }
},
'highlight': {
    'fields': {
        'content': {}
    }
},
'track_scores': 'true',
    'sort': [
        {
            '_score': {'order': 'desc'}
        }
    ]
}

例如,我有两个文件。 第一个文件:

{
    "content": "laptop laptop laptop",
    "display_content": ""
}

第二个文档:

{
    "content": "laptop mobile",
    "display_content": ""
}

我想自定义ElasticSearch得分,以将第二个文档的得分提高到mobile laptop之类的查询。我该怎么做?

1 个答案:

答案 0 :(得分:2)

您不需要function_score。这是match查询的默认行为。

但是,我了解到您希望减少分数中重复术语的影响。

如果您想完全放弃重复的术语,可以使用unique token filter。然后,"laptop laptop laptop"字段将被索引为"laptop",从而完全消除了重复项的影响。

如果您仍想保留重复的术语,则可以使用BM25相似度函数(默认相似度函数)的参数k1来更改其影响。

请参见the documentation为索引配置相似性功能。请注意,无需重新编制索引就可以更改相似性,只需关闭并重新打开索引即可。

请注意,更改相似度函数参数的值被视为专家功能。您可以在this article

中阅读有关此主题的更多信息