我正在寻找一种自定义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的查询。我该怎么做?

最佳答案

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

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

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

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

请参阅the documentation为索引配置相似性函数。请注意,无需重新编制索引即可更改相似性,您只需要关闭并重新打开索引即可。

请注意,将相似度函数参数的值视为专家功能。您可以在this article中阅读有关此主题的更多信息

10-01 16:58