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" } } }
ひと手間いりますが、一度マッピングさえしてしまえばそれほど気にせずにできると思います。
Elasticsearch実践ガイド (impress top gear)
- 作者: 惣道哲也
- 出版社/メーカー: インプレス
- 発売日: 2018/06/15
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る