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

Mon*_*key 6 elasticsearch

如何在我想要为field_value_factor执行的属性上处理null值?我希望按受欢迎程度加权,但有些记录对该属性具有空值.我是否必须在该数据本身中为该属性设置最小值10?这种方式看起来似乎很笨拙.

{
  "query": {
      "function_score": { 
        "query":{
          "multi_match" : {
            "query" : "new girl",
            "fields" : [ "title^1.2", "name"] 
          }
        },
        "field_value_factor": {
          "field":"popularity",
          "modifier":"log1p"
        },
        "boost_mode":"multiply"

      }
  }
}
Run Code Online (Sandbox Code Playgroud)

yah*_*ann 7

ES的空值默认行为是根本不添加字段值.但是,您可以在映射中设置默认的null_value.所以在你的情况下:

 ...
 "properties" : {
    ...     
    "popularity" : {
       "type" : "integer",
       "null_value" : "0"    # or whatever
       ...
       }
    ...
 }
Run Code Online (Sandbox Code Playgroud)

参考: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/main/java/org/elasticsearch/common/lucene/search/function/FieldValueFactorFunction.java

并看看第53-87行.