[ElasticSearch]Java APIのTermQuery


1.語句検索(Term Query)
見出しクエリーは、ElasticSearchの簡単なクエリーです.特定のフィールドに単語が含まれているドキュメントにのみ一致し、正確で分析されていない単語です.termクエリは、私たちが設定した正確な値を検索します.termクエリ自体は簡単で、フィールド名と検索したい値を受け入れます.
次のコードクエリは、collegeフィールドに「California」という単語が含まれているドキュメントと一致します.見出しクエリーは分析されていないため、インデックスドキュメントの見出しと完全に一致する見出しを提供する必要があります.Californiaではなく、小文字で始まるcaliforniaを使用して検索します.Californiaという言葉はインデックスを作成するときにcalifornia(デフォルトの分詞器)になっているからです.
// Query
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("country", "AWxhOn".toLowerCase());
// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(termQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-term-query.html
2.多語句検索(Terms Query)
見出しクエリー(Term Query)は、分析されていない単一の見出しを一致させることができ、複数の見出しクエリー(Terms Query)は、このような複数の見出しを一致させるために使用することができる.指定したフィールドに任意の単語が含まれている限り、ドキュメントにクエリーできます.
次のコードはcountryフィールドに「ドイツ」または「ベルギー」を含むすべてのドキュメントを取得します.
// Query
TermsQueryBuilder termsQueryBuilder = QueryBuilders.termsQuery("country", "   ", "  ");
// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(termsQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-terms-query.html
3.範囲クエリー(Range Query)
範囲クエリーを使用すると、あるフィールド値がある範囲にあるドキュメントを見つけることができます.フィールドは数値型でも文字列ベースでも構いません.範囲クエリーは、単一のフィールドのみです.
方法:(1)gte():範囲クエリーは、このパラメータ値以上のフィールド値を持つドキュメントに一致します.
(2)gt():範囲クエリーは、このパラメータ値よりもフィールド値の大きいドキュメントに一致します.
(3)lte():範囲クエリーは、このパラメータ値以下のフィールド値を持つドキュメントに一致します.
(4)lt():範囲クエリーは、このパラメータ値よりもフィールド値が小さいドキュメントに一致します.
(5)from()開始値to()終了値の2つの関数をincludeLower()とincludeUpper()関数と組み合わせて使用する.
(6)includeLower(true)は、from()クエリがこのパラメータ値以上のフィールド値を持つドキュメントに一致することを示します.
(7)includeLower(false)は、from()クエリがこのパラメータ値よりもフィールド値を大きくするドキュメントに一致することを示します.
(8)includeUpper(true)は、to()クエリがこのパラメータ値以下のフィールド値を持つドキュメントに一致することを示します.
(9)includeUpper(false)は、to()クエリがこのパラメータ値よりもフィールド値を小さくするドキュメントを表す.
// Query
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age");
rangeQueryBuilder.from(19);
rangeQueryBuilder.to(21);
rangeQueryBuilder.includeLower(true);
rangeQueryBuilder.includeUpper(true);
//RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("age").gte(19).lte(21);
// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(rangeQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();

上のコードのクエリ文は、次のものと同等です.
QueryBuilder queryBuilder = QueryBuilders.rangeQuery("age").gte(19).lte(21);

参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-range-query.html
4.クエリーが存在する(Exists Query)
指定したフィールドに少なくとも1つのno-nullの値がある場合、ドキュメントが返されます.
// Query
ExistsQueryBuilder existsQueryBuilder = QueryBuilders.existsQuery("name");
// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(existsQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

たとえば、次のいくつかのドキュメントでは、上記のコードが一致します.
{ "name": "yoona" }
{ "name": "" }
{ "name": "-" }
{ "name": ["yoona"] }
{ "name": ["yoona", null ] }

1つ目は文字列でnull以外の値です.
2つ目は空の文字列でnullではありません.
3番目に標準アナライザを使用する場合、語句は返されませんが、元のフィールド値はnullではありません(Even though the standard analyzer would emit zero tokens,the original field is non-null).
5番目のうち少なくとも1つはnull値ではありません.
次のドキュメントでは、上記のコードの一致は得られません.
{ "name": null }
{ "name": [] }
{ "name": [null] }
{ "user":  "bar" }

1つ目はnull値です.
2番目には値がありません.
3つ目はnull値のみで、少なくとも1つのnull値以外が必要です.
4番目は指定したフィールドと一致しません.
参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-exists-query.html
5.プレフィックスクエリ(Prefix Query)
接頭辞クエリーでは、特定のフィールドに指定された接頭辞が開始されたドキュメントと一致します.次のコードでは、すべてのcountryフィールドが「ブドウ」で始まるドキュメントをクエリーします.
// Query
PrefixQueryBuilder prefixQueryBuilder = QueryBuilders.prefixQuery("country", "  ");

// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(prefixQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

コメント:
        ,         ,         :
QueryBuilder queryBuilder = QueryBuilders.prefixQuery("club", "     ");

以上の違いの主な原因はclubフィールド(デフォルトmapping構成)がアナライザ解析されたことであり、インデックスのデータは「レアル・マドリード」ではなくcountryフィールドが解析されていない(mapping構成not_analyzed).
参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-prefix-query.html
6.ワイルドカードクエリ(Wildcard Query)
ワイルドカードクエリーでは、指定したフィールドがワイルドカード式を満たすドキュメントを取得できます.プレフィックスクエリーと同様に、ワイルドカードクエリー指定フィールドは分析されていません(not analyzed).
0文字以上の代わりにアスタリスク、1文字の代わりに疑問符を使用できます.アスタリスクは、一致する数が制限されず、後者の一致する文字数が制限されていることを示します.このテクニックは主に英語検索で使われています.「computer*」と入力すると「computer、computers、computerised、computerized」などの単語が見つかりますが、「comp?ter」と入力すると「computer、compater、competer」しか見つかりませんなどの単語があります.ワイルドカードクエリはパフォーマンスをあまり重視せず、可能な限り避けます.特に、プレフィックスワイルドカード(ワイルドカードで始まる単語)は避けます.
// Query
WildcardQueryBuilder wildcardQueryBuilder = QueryBuilders.wildcardQuery("country", " * ");
// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(wildcardQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-wildcard-query.html
7.正規表現クエリー(Regexp Query)
正規表現クエリーでは、指定したフィールドが正規表現を満たすドキュメントを取得できます.接頭辞クエリーと同様に、正規表現クエリー指定フィールドは分析されていません(not analyzed)を選択します.正規表現クエリーのパフォーマンスは、選択した正規表現に依存します.正規表現が複数の単語に一致する場合、クエリーは遅くなります.一般的なルールでは、正規表現が一致する単語の数が高いほど、クエリーは遅くなります.
// Query
RegexpQueryBuilder regexpQueryBuilder = QueryBuilders.regexpQuery("country", "(  |  ) ");

// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(regexpQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-regexp-query.html
8.ファジイクエリ(Fuzzy Query)
指定したフィールドがstringタイプの場合、ファジイクエリは、距離の編集アルゴリズムに基づいてドキュメントに一致します.距離の編集の計算は、私たちが提供したクエリの語句と検索されたドキュメントに基づいています.指定したフィールドが数値タイプまたは日付タイプの場合、ファジイクエリは、フィールド値の増減操作に基づいてドキュメントに一致します.(The fuzzy query uses similarity based on Levenshtein edit distance for string fields,and a+/-margin on numeric and date fields).このクエリはCPUリソースを占有するが、ユーザがスペルミスをした場合など、ファジイマッチングが必要な場合に役立つ.また、検索語の末尾に文字「~」を付けてファジイクエリを行うこともできる.
8.1 stringタイプフィールド
ファジイクエリは、指定した語句と一致する可能性のあるすべての結果(fuzzinessで指定した最大編集距離の範囲内)を生成します.次に、生成されたすべての結果がインデックス内にあるかどうかを確認します.
次のコードでは、クエリーcountryフィールドが「スペイン」のすべてのドキュメントで曖昧になり、最大編集距離が1(fuzziness)、最小共通接頭辞が0(prefixLength)であることを指定します.つまり、共通接頭辞は必要ありません.
// Query
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("country", "   ");
//       
fuzzyQueryBuilder.fuzziness(Fuzziness.ONE);
//     
fuzzyQueryBuilder.prefixLength(0);
// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(fuzzyQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

8.2数値および日付タイプフィールド
範囲クエリー(Range Query)のaroundと似ています.指定した値の上下に変動するfuzzinessサイズの範囲を形成します.
-fuzziness <= field value <= +fuzziness

次のコードは18歳前後で2歳変動し、[17-19]の範囲クエリーを形成します.
// Query
FuzzyQueryBuilder fuzzyQueryBuilder = QueryBuilders.fuzzyQuery("age", "18");
fuzzyQueryBuilder.fuzziness(Fuzziness.TWO);
// Search
SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
searchRequestBuilder.setTypes(type);
searchRequestBuilder.setQuery(fuzzyQueryBuilder);
//   
SearchResponse searchResponse = searchRequestBuilder.get();

参照先:https://www.elastic.co/guide/en/elasticsearch/reference/2.4/query-dsl-fuzzy-query.html
コメント:
     ElasticSearch 2.4.1