やっとElasticsearchのクエリーでドキュメントの検索ができた
検索のやり方を備忘録として残しておく
データにはElasticsearchのサンプルデータを利用しています。
全文検索クエリ:単語一致
単語単位で検索する場合
RDBのLIKEに近いけどあくまで単語単位での検索
例1) 住所に単語として Street
が含まれるドキュメントを検索する
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : "Street" } } }'
例2)住所に Elton
又は Street
が含まれているドキュメントを検索する(※RDBでいうところのOR検索)
※半角スペースで区切ることで、複数条件での検索になる
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : "Elton Street" } } }'
例3)住所に Elton
且つ Street
が含まれているドキュメントを検索する(※RDBでいうところのAND検索)
※半角スペースで区切ることで、複数条件での検索になる ※AND検索する場合は、operatorを指定する
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : { "query": "Elton Street", "operator": "and" } } } }'
例4) ヒット率での検索
最低N個以上キーワードが含まれていること
といったようなRDBにない検索が可能。
minimum_should_match
に含まれていてほしい 個数
OR 割合(%)
が指定可能である
以下の場合は Elton Street Putnam Place Rockwell Avenue
のうち2個以上含まれている結果が取得できる
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "match": { "address" : { "query": "Elton Street Putnam Place Rockwell Avenue", "minimum_should_match": 2 } } } }'
Termクエリ
Termクエリ
Termクエリはkeyword型に対して検索を行う。
ドキュメント格納時
- text型はアナライザが単語分割を行って転置インデクスを構築する
- keyword型はドキュメントにそのまま格納される
検索
- text型は転置インデクスを利用して検索が行われる
- keyword型は格納されたドキュメントと検索キーワードを直接比較する
また、termクエリは格納されている文字列と完全一致するものを検索する(大文字・小文字も含めて比較する)
例)
curl -Xget "http://172.17.0.2:9200/bank/account/_search" -H 'Content-Type: application/json' -d' { "query": { "term": { "address": "171 Putnam Avenue" } } }'