我正在寻找一种自定义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
之类的查询。我该怎么做?
答案 0 :(得分:2)
您不需要function_score
。这是match
查询的默认行为。
但是,我了解到您希望减少分数中重复术语的影响。
如果您想完全放弃重复的术语,可以使用unique
token filter。然后,"laptop laptop laptop"
字段将被索引为"laptop"
,从而完全消除了重复项的影响。
如果您仍想保留重复的术语,则可以使用BM25相似度函数(默认相似度函数)的参数k1
来更改其影响。
请参见the documentation为索引配置相似性功能。请注意,无需重新编制索引就可以更改相似性,只需关闭并重新打开索引即可。
请注意,更改相似度函数参数的值被视为专家功能。您可以在this article
中阅读有关此主题的更多信息