Отображение null_value в 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}'

Затем я попытался вернуть вставленный doc:

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

Отображение поля "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.*" }
  }
}'