Elasticsearchのクエリとフィルターで簡単な検索を試す例

昨日、ElasticsearchのインストールとCSVからのデータ挿入 を行い、Elasticsearch で検索を行えるところまで作業しました。その続きで、簡単な検索を試してみます。

スポンサーリンク

Elasticsearch の検索を試すには、Marvel の Sense を使うなど GUI から操作する方法と、ターミナルからコマンドで行う方法が利用できます。また Elasticsearch で検索を実行する方法として、Queries と Filters の2種類を使う方法が用意されています。

イメージを掴むために、さっそく Queries を使って検索を行ってみることにします。まずは、elasticsearch を起動。

コマンドでの検索

ターミナルから以下の REST API に curl コマンドで検索を実行できます。クエリもレスポンスも json 形式です。

name フィールドを対象に「熊本 焼肉」で検索してみました。default_operator を and としていますので、「熊本 and 焼肉」の検索となり、name フィールドに「熊本」と「焼肉」の両方を含む結果を返します。

レスポンスは以下のようになります。2件ヒットしました。

Marvel Sense を使って GUI で検索

Marvel Sense を利用する場合は、ブラウザから以下の URL にアクセス。

http://localhost:9200/_plugin/marvel/sense/index.html

左側のボックスにクエリを次のように入力し、三角ボタンを押してクエリ実行。

今回は、全てのフィールドを対象に検索するために fields に _all を指定しました。レスポンスは以下の通り。21件ヒットしています。

Queries と Filters

Elasticsearch で検索を実行する方法として、Queries(クエリ)と Filters(フィルター)の2種類が用意されています。それぞれ公式ドキュメントより翻訳して特徴を列挙しておきます。

Queries

・クエリは全文検索用に利用する。
・関連性のスコアに依存する結果を得たい時に利用する。

Filters

・フィルターはキャッシュされ、たいしてメモリも使わない。
・他のクエリが同じフィルターを利用する場合は爆速である。
・term, terms, prefix, range などのフィルターはデフォルトでキャッシュされ、同じフィルターが複数の異なるクエリで利用されるようなケースで推奨される。”age higher than 10″ のような range フィルターのケースなど。
・他の geo, scripts などのフィルターはフィールド値とともにメモリーにロードされ、デフォルトではキャッシュされない。これらのフィルターは元々速いし、キャッシュするのに単に実行するより余計な処理が必要なため。
・残りの and, not, or などのフィルターは他のフィルターを操作するので、基本的にキャッシュされない。
・全てのフィルターは _cache 要素と _cache_key 要素を指定して明示的にキャッシュを操作できる。大きなフィルター作成時などに便利。

以上を読んだところ、次のようなケースではフィルターを使って検索条件を組み立てたほうが良いかと思われます。

・同じ検索条件を複数の異なるクエリで使いまわすようなケース
・単純にフィールド値の大小などで絞り込み検索を行うようなケース
・スコアリングに関係ない検索を行うようなケース

Marvel Sense でフィルターを試す例

address フィールドに対して「熊本」でフィルターをかけます。

レスポンス。

821件がヒットしました。ちなみにデフォルトでは、検索ヒットしたうちの10件の結果を返します。20件返したければ、size パラメータで指定します。

URI Search

terms フィルターで “熊本” または “福岡” でフィルターする検索例。

レスポンス。4137件ヒットしています。

フィルターとクエリを組み合わせて検索

では、最後に熊本の焼肉屋さんで、ランチ営業を行っているお店を検索してみます。熊本、ランチ営業の2つの検索条件は filter で and を使いました。

レスポンス。5件ヒットしました。

クエリとフィルターは以上のような使い方となります。実践ではもっと沢山フィルターを複数組み合わせたり、様々なクエリとともに用いることになると思います。クエリもフィルターも数十種類ずつ用意されていますので、柔軟に検索条件を組み立てることができるはずです。詳細は公式ドキュメントをご参照お願いします。親子テーブルの検索や、関連性スコアを使った検索・ソートについては末尾の参考リンクが詳しいです。

簡単ではありますが、Elasticsearch のクエリとフィルターを使って検索を行う例でした。以上で Elasticsearch の基本は押さえられたと思います。次回は、MySQL データベースから Elasticesearch へデータをインポートするために、JDBC River Plugin を使ってみたいと思います。

スポンサーリンク
全文検索システムを実装するには、ElasticSearch がおすすめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!