如何在弹性搜索field_value_factor中处理空值

时间:2014-09-17 18:42:43

标签: elasticsearch

如何处理我想要为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"

      }
  }
}

2 个答案:

答案 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的源代码:

https://gitlab.devero.com/development/elasticsearchssl/commit/8fbd1bdd489a9d31d3bda249c3ed9715052e196d

向下滚动到: 的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上)