2015-08-31 43 views
0

我有一个Elasticsearch映射,其中包含语言代码的字段,例如, EN,DE,ES,FR等。如果用户开始使用英文搜索,我想提高搜索结果中的所有英文文档;法语,西班牙语,德语等相同基于doc字段的字符串值在Elasticsearch中提升结果

我猜,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忽略。

回答

1

使用function_score更具体地说script_score的确是要走的路。我会这样做的方式是使用一个名为LANG的参数,它将用当前用户的语言进行初始化(例如,下面的"LANG": "EN")。那么你的脚本只是需要比较与LANG参数文件的lang场和2,而不是1

 { 
     "script_score": { 
     "script": "_score * (doc.lang.value == LANG ? 2 : 1)", 
     "params": { 
      "LANG": "EN" 
     } 
     } 
+0

工程就像一个魅力,谢谢乘以分数。我必须首先在ES配置文件中启用脚本:'script.groovy.sandbox.enabled:on' –