sakutarou’s blog

とりあえずWeb系技術をゆるく書いていく

やっとElasticsearchのクエリーでドキュメントの検索ができた

検索のやり方を備忘録として残しておく
データにはElasticsearchのサンプルデータを利用しています。

www.elastic.co

全文検索クエリ:単語一致

単語単位で検索する場合
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"
    }
  }
}'