Elasticsearch中的null_value映射

时间:2014-04-01 20:21:29

标签: elasticsearch

我在tweetb索引中为twitter类型创建了一个映射:

curl -XPUT http://www.mydomain:9200/twitter/tweetb/_mapping -d '{
  "twitter": {
    "mappings": {
      "tweetb": {
        "properties": {
          "message": {
            "type": "string",
            "null_value": "NA"
          }
        }
      }
    }
  }
}'

然后,我放了一个文件:

curl -XPUT http://www.mydomain.com:9200/twitter/tweetb/1 -d '{"message": null}'

然后,我试图让插入的文档回复:

curl -XGET http://www.mydomain:9200/twitter/tweetb/1

然后又回来了:

{
  "_index": "twitter",
  "_type": "tweetb",
  "_id": "1",
  "_version": 2,
  "found" : true,
  "_source" : { "message": null }
}

我期待"message" : "NA"字段中的_source。但是,看起来"null_value"无效。我错过了什么吗?

1 个答案:

答案 0 :(得分:30)

"null_value"字段映射不会更改存储的值,而是更改搜索中使用的值。

如果您尝试使用"message"搜索"NA",那么它应该出现在结果中:

curl -XPOST http://www.mydomain.com:9200/twitter/tweetb/_search -d '{
  "query" : {
    "match" : { "message" : "NA" }
  }
}'

有趣的是,它应该以实际值null作为回应。现在,如果您添加一个原始值为"NA"的新文档并执行搜索,那么您应该看到为以上查询返回的两个结果 - 一个带有值,另一个带有值已定义null

也许有类似的兴趣,这适用于其他查询以及基于它的索引方式,这就是小写n.*匹配的原因,但是N.*半惊人地不匹配:

curl -XPOST http://www.mydomain.com:9200/twitter/tweetb/_search -d '{
  "query" : {
    "regexp" : { "message" : "n.*" }
  }
}'