如何处理我想要为field_value_factor执行的属性的空值?我希望按受欢迎程度加权,但有些记录对该属性具有空值。我是否必须在该数据本身中为该属性设置最小值10?这种方式看起来很像kludgy。
{
"query": {
"function_score": {
"query":{
"multi_match" : {
"query" : "new girl",
"fields" : [ "title^1.2", "name"]
}
},
"field_value_factor": {
"field":"popularity",
"modifier":"log1p"
},
"boost_mode":"multiply"
}
}
}
答案 0 :(得分:6)
ES的空值默认行为是根本不添加字段值。但是,您可以在映射中设置默认的null_value。所以在你的情况下:
...
"properties" : {
...
"popularity" : {
"type" : "integer",
"null_value" : "0" # or whatever
...
}
...
}
参考: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-core-types.html
“如果字段有(JSON)空值,请使用null_value作为字段值。默认情况下不添加字段。”
我很惊讶ES没有丢失任何错误。您应该确认文件实际上(或不)具有您的“受欢迎程度”字段。尝试使用Sense?
如果你试图在一个不存在的字段上进行计算,我很确定ES会抛出[field [x]]异常的缺失值。这既是我自己的经验,也是检查实现field_value_factor的源代码:
向下滚动到: 的src /主/ JAVA /组织/ elasticsearch /普通/ lucene的/搜索/功能/ FieldValueFactorFunction.java
并查看第53-87行。
答案 1 :(得分:0)
对我而言,解决方案是将missing
属性添加到field_value_factor
:
{
"query": {
"function_score": {
"query": {},
"field_value_factor": {
"field": "purchases",
"missing": 0
}
}
}
}
(请注意,这是在ES 2.3上)