我正在寻找一种自定义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中阅读有关此主题的更多信息