首页 > 解决方案 > 如何在 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. 我怎么能做这个?

标签: elasticsearch

解决方案


你不需要一个function_score. 这是match查询的默认行为。

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

如果您想完全丢弃重复的术语,您可以使用unique令牌过滤器。然后该字段"laptop laptop laptop"将被索引为"laptop"完全消除重复术语的影响。

如果您仍然想保留重复的术语,您可以使用k1BM25 相似度函数(默认相似度函数)的参数来改变它们的影响。

请参阅文档以配置索引的相似度函数。请注意,无需重新索引即可更改相似度,您只需关闭并重新打开索引即可。

请注意,更改相似函数参数的值被视为专家特征您可以在本文中阅读有关此主题的更多信息


推荐阅读