我有一个Elasticsearch映射,其中包含语言代码的字段,例如EN,DE,ES,FR等。如果用户以英语开始搜索,我想在搜索结果中增加所有英语文档。法语,西类牙语,德语等也一样。
我猜想script_score
是可行的方法:
"script_score" : {
"script" : "_score * doc['my_numeric_field'].value"
}
https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-function-score-query.html#function-script-score
但是,我需要比较每个索引文档的语言代码。将
LANG
作为用户的当前语言代码,可能看起来像这样:"script_score" : {
"script" : "_score * ("+LANG+" == doc['lang'].value ? 2 : 1)"
}
这里的本质将是一个三元运算符,例如,以便在相关语言与当前用户的语言匹配的情况下,以两倍的倍数来放大所讨论的文档:
LANG == doc['lang'] ? 2 : 1
到目前为止,ES都忽略了任何此类功能。
最佳答案
实际上,使用function_score
(更具体地说是script_score
)是可行的方法。我的操作方式是使用名为LANG
的参数,您可以使用当前用户的语言进行初始化(例如下面的"LANG": "EN"
)。然后,您的脚本只需要将文档的lang
字段与LANG
参数进行比较,并将分数乘以2而不是1。
{
"script_score": {
"script": "_score * (doc.lang.value == LANG ? 2 : 1)",
"params": {
"LANG": "EN"
}
}
关于function - 根据doc字段的字符串值在Elasticsearch中 boost 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32309565/