Elasticsearch 6 を使ったデータ検証 その5( クエリ での検索 ) - 株式会社CoLabMix

Elasticsearch 6 を使ったデータ検証 その5( クエリ での検索 )

さて、前回に引き続き Elasticsearch での確認となり、今回は クエリ の確認を行っていきます。

★関連記事
Elasticsearch 6 を使ったデータ検証 その1(Dockerでコンテナの作成と確認)

Elasticsearch 6 を使ったデータ検証 その2(マッピングの登録をしてみる)

Elasticsearch 6 を使ったデータ検証 その3(bulkでデータを投入してみる)

Elasticsearch 6 を使ったデータ検証 その4(チュートリアル記事とデータの検索での比較)

Elasticsearch 6 を使ったデータ検証 その6(Aggregationを使った分類・集計)

Elasticsearch 6 を使ったデータ検証 その7(Analyzerについて)

 

データは前回までに入力したデータを利用しますが、一点、「restaurant」の「category」を「category1」のデータのみを取り込んだ「keyword」型に変更しています。

「keyword」で使うクエリを利用したかったので変更です。

さて、各クエリの確認に移ります。

OR条件での検索

クエリに複数のmatch条件を入れるとOR条件での検索になります。

 

こちらは明示的にORを指定していませんが、デフォルトの動きとなります。

ちなみにここでは「hits.total」である「10286」件が検索でヒットした数になります。

 

AND条件での検索

AND条件で検索を行うには「operator」句で「and」を指定します。

 

検索結果が「114」件に減り、ANDの条件になりました。

 

ある一定の条件を満たしたものを検索

「minimum_should_match」句を使うと、OR条件の中から一定の数を上回るものを検索結果とします。

ここでは4つのキーワードのうち2つ以上を満たせば検索結果となります。

 

条件に適応する数が増えればスコアが上がります。

 

指定された語順のドキュメントでの検索

「match_phrase」句を使うと指定された語順のもの(空白を含む)にマッチすると検索結果として表示されます。

 

「ラーメン・カレー」は区切り文字として「・」が利用されたので検索対象になりました。
「ラーメン カレー」でもマッチします。

『ラーメンの「風香」、うどん・そばの「一空」、カレー・どんぶり』という文章のものもありますが、間に文章を含んでいるのでマッチしませんでした。

 

keyword型の一致で検索

keyword型の語句に一致するものを検索します。

こちらは完全一致での検索になります。

 

keywordを複数指定しての検索

検索条件の設定が「terms」の複数形になっています。

 

範囲を指定しての検索(数字)

数字の範囲を指定しての検索です。

下では検索対象のデータ型は整数型のものですが、小数点ありの範囲指定のものでも無事範囲指定されて検索が動きました。

 

「以上」、「以下」などのオペレータ名の選択はこちらになります。

オペレータ名 意味
gte 〜以上
lte 〜以下
gt 〜より大きい
lt 〜より小さい

 

日付の範囲を指定しての検索

「range」句では時間の範囲を指定しての検索も可能になります。

以下では検索インデックスの対象が「rating」に変わっていますが、日付型の範囲を指定して検索を実施しています。

 

日付計算式を利用しての検索

日付計算式を利用しての検索は以下のようになります。

 

日付計算式の記号では以下が利用できます。

記号 意味
y
M
w
d
h または H 時間
m
s

 

複合クエリ - Boolクエリ

複合クエリであるBoolクエリでは基本クエリを複数組み合わせて様々な条件での検索を行うことができます。

複合クエリの基本的な文法は以下になります。

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

「must」、「filter」、「should」、「must_not」の4つのクエリを使って検索条件の指定を行います。

 

mustクエリ

mustでは条件が必ず含まれているべきクエリを設定します。

must区の中に複数の基本クエリを指定した場合は全ての条件が満たされている必要があります。

 

上記では「description」にラーメンが含まれていて、且つ「access_count」が5千以上の条件のものを抽出しています。

 

shouldクエリ

shouldクエリで複数の基本クエリを指定した場合、いずれかのクエリ条件を満たせばドキュメントがヒットします。

条件に複数ヒットすれば、高いスコアがつけられます。

上記では「access_count」が5万以上のものか「photo_count」が百以上の条件のものを抽出しています。

「access_count」が50,000以上で、「photo_count」が100以上のものは高いスコアとなります。

 

minimum_should_match句で最少必要数の条件の設定

minimum_should_match句では、ORの複数条件のうちいくつ満たせば良いかを設定できます。

上記では複数記載した条件のうち、最低50%以上の条件を満たせばヒットします。

 

must_notクエリ

must_not句を指定すると、指定した基本クエリに当てはまるドキュメントは検索結果から除外されます。

上記では「category」が「317」のものが除外されています。

 

filterクエリ

他の3つのクエリが検索結果の関連度に応じてスコアが返されますが、filterの条件の場合、「マッチする」か「マッチしない」かのみが返されます。

この検索結果はスコアには影響を与えません。

上記ではアクセス数50,000以上の条件をつけていますが、そちらの条件はスコアに影響を与えていません。

filterクエリでのキャッシュ(フィルターキャッシュ)はノードクエリキャッシュと呼ばれ、スコアに関連しなくても良いクエリであれば性能向上がはかれます。

検索結果をクエリキャッシュとしてメモリ上に保存しますので、2度目以降の検索のスピードがアップします。

https://www.elastic.co/guide/en/elasticsearch/reference/6.3/query-cache.html

 

クエリ結果の並び替え

sort句を利用するとスコア以外の結果の並び替えを行えます。

sort句を利用しての検索結果の並び替え

検索結果としてスコアではなく、ページのアクセス順での結果の表示を行います。

ソート対象のフィールドが検索結果に表示され、スコアは「null」となりました。

 

sort句に複数条件を入れての検索結果の並べ替え

「sort」句に複数記載した場合は、最初の項目(ここでは「stock_price」)でソートし複数ヒットした場合には、さらに次のフィールド(ここでは「founded」)でソートされます。

 

算術計算に基づいたソート条件

フィールドの値が配列型を取る場合、Sortモードオプションを利用すると配列の最小、最大、平均の値といった算術計算に基づいた結果を表示できます。

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-sort.html

上記では「price」という配列型フィールドの平均を計算して計算された平均でソートを行っています。

modeの値 意味
avg 値の平均値
min 値の最小値
max 値の最大値
sum 値の合計値
median 値の中央値

 

Luceneシンタックスの検索形式を使っての検索

querty句では検索部分にLuceneシンタックスの検索形式を直接記載できます。

★Luceneシンタックス
https://lucene.apache.org/core/2_9_4/queryparsersyntax.html

上記では「ラーメン」のキーワードのスコアがブーストされています。

 

色々と実施して見ましたがとりあえずクエリの検索としてはここまでで。

次回は「Group By」に似た、Aggregationを利用してドキュメントの分類と集計を行ってみます。

 

★関連記事
Elasticsearch 6 を使ったデータ検証 その1(Dockerでコンテナの作成と確認)

Elasticsearch 6 を使ったデータ検証 その2(マッピングの登録をしてみる)

Elasticsearch 6 を使ったデータ検証 その3(bulkでデータを投入してみる)

Elasticsearch 6 を使ったデータ検証 その4(チュートリアル記事とデータの検索での比較)

Elasticsearch 6 を使ったデータ検証 その6(Aggregationを使った分類・集計)

Elasticsearch 6 を使ったデータ検証 その7(Analyzerについて)

 

このブログは株式会社CoLabMixによる技術ブログです。

GCP、AWSなどでのインフラ構築・運用や、クローリング・分析・検索などを主体とした開発を行なっています。

Ruby on RailsやDjango、Pythonなどの開発依頼などお気軽にお声がけください。

開発パートナーを増やしたいという企業と積極的に繋がっていきたいです。

お問い合わせやご依頼・ご相談など

     

    関連記事

    1. Rails5.2.0(Beta)のインストール

    2. Sky WayでMeetingアプリをReactで実装

    3. RedHatLinux8でのRDXメディアのフォーマット

    4. terraformでVPC+EC2+RDS(aurora-mysql)…

    5. Firefoxの「RESTClient」からPOSTの値の送信

    6. AWSのCloudFrontに署名付きURLを使って有効期限付きのWe…