ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます。脱線もしますが助けになれば幸いです。

Elasticsearchの検索においてnullを検索条件にしたい時にすること

Elasticsearchにおいてnullで検索したい時に、手順を踏む必要があったためまとめます。

TL;DR

{
  "type": "keyword",
  "null_value": "NULL"
}

上記のようにして"NULL"で検索すればnullを探せます。

下記のような本のデータを格納するindexおよびtypeがあったとします。

PUT books
{
  "mappings": {
    "book": {
      "properties": {
        "name": {
          "type": "keyword"
        },
        "author_name": {
          "type": "keyword"
        },
        "description": {
          "type": "keyword"
        }
      }
    }
  }
}

で、データを入れてみます。

POST books/book
{
  "name": "はらぺこあおむし",
  "author": "エリック・カール",
  "price": 1000,
  "description": null
}

description(備考)が空のもので検索したいという要件があった時。

GET books/book/_search
{
  "query": {
    "term": {
      "description": null
    }
  }
}

上記のようなクエリを組むとエラーを吐きます。

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "field name is null or empty"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "field name is null or empty"
  },
  "status": 400
}

検索のクエリのvalue部分にnullは受け付けてくれないようです。""と空文字を入れてもだめで、これは空文字を探すのでnullは探してくれません。

対処方法

マッピングの情報を少し変えてやります。

PUT books
{
  "mappings": {
    "book": {
      "properties": {
        "name": {
          "type": "keyword"
        },
        "author_name": {
          "type": "keyword"
        },
        "description": {
          "type": "keyword",
          "null_value": "NULL"
        }
      }
    }
  }
}

descriptionの定義の箇所にあるように"null_value": "NULL"を追加します。これは検索時に指定した文字列(今回の場合はNULL)で検索すると、nullを探すように設定してあります。別にNULLでなくともHOGEとかKYOMUとかKARAPPOでも良いです。

NULLという文字列で検索する予定が無い限りはNULLで良いかなーと思います。

あとはこの値を指定することで検索が可能です。

GET books/book/_search
{
  "query": {
    "term": {
      "description": "NULL"
    }
  }
}

ひと手間いりますが、一度マッピングさえしてしまえばそれほど気にせずにできると思います。

www.elastic.co

Elasticsearch実践ガイド (impress top gear)

Elasticsearch実践ガイド (impress top gear)