検索の実行

edit

基本的な検索パラメータをいくつか説明しました。Query DSLをもう少し詳しく調べましょう。最初に、返されたドキュメントフィールドを調べます。デフォルトでは、すべての検索結果の一部として、完全なJSONドキュメントが返されます。これは、ソースと呼ばれます(検索ヒットの`_source`フィールド)。ソースドキュメント全体が返されないようにしたい場合は、返されるソースの中から一部のフィールドだけを要求できます。

次の例は、検索から`account_number`と`balance`の2つのフィールド(`_source`ではなく)を返す方法を示しています。

GET /bank/_search
{
  "query": { "match_all": {} },
  "_source": ["account_number", "balance"]
}

上記の例は、単に`_source`フィールドを減らします。`_source`という名前のフィールドを1つだけ返しますが、その中には`account_number`フィールドと`balance`フィールドだけが含まれます。

SQLの経験があれば、上記は`SQL SELECT FROM`フィールドリストの考え方に似ていると思うでしょう。

では、クエリ部分に移りましょう。前に、`match_all`クエリを使用してすべてのドキュメントに一致する方法を説明しました。ここでは、​`match`クエリ​という新しいクエリを紹介します。このクエリは、基本的なフィールド検索クエリと考えることができます(つまり、検索は特定のフィールドまたは一連のフィールドに対して行われます)。

次の例は、番号20が付いた口座を返します。

GET /bank/_search
{
  "query": { "match": { "account_number": 20 } }
}

次の例は、アドレスに「mill」という語を含む口座をすべて返します。

GET /bank/_search
{
  "query": { "match": { "address": "mill" } }
}

次の例は、アドレスに「mill」または「lane」という語を含む口座をすべて返します。

GET /bank/_search
{
  "query": { "match": { "address": "mill lane" } }
}

次の例は、アドレスに「mill lane」という句を含む口座をすべて返す`match`の変形(match_phrase)です。

GET /bank/_search
{
  "query": { "match_phrase": { "address": "mill lane" } }
}

次に、​bool (Boolean)​について説明します。`bool`クエリを使用すると、ブール論理を使用して小さいクエリを組み合わせて大きいクエリにすることができます。

次の例は、2つの`match`クエリを構成して、アドレスに「mill」と「lane」を含む口座をすべて返します。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

上記の例では、`bool must`句は、一致とみなされるドキュメントに対してtrueでなければならないすべてのクエリを指定します。

対照的に、次の例は、2つの`match`クエリを構成して、アドレスに「mill」または「lane」を含む口座をすべて返します。

GET /bank/_search
{
  "query": {
    "bool": {
      "should": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

上記の例では、`bool should`句は、一致とみなされるドキュメントに対していずれかがtrueでなければならないクエリのリストを指定します。

次の例は、2つの`match`クエリを構成して、アドレスに「mill」と「lane」のどちらも含まない口座をすべて返します。

GET /bank/_search
{
  "query": {
    "bool": {
      "must_not": [
        { "match": { "address": "mill" } },
        { "match": { "address": "lane" } }
      ]
    }
  }
}

上記の例では、`bool must_not`句は、一致とみなされるドキュメントに対してどちらもtrueであってはならないクエリのリストを指定します。

`must`句、`should`句、および`must_not`句を`bool`クエリ内に同時にまとめることができます。さらに、`bool`クエリをこれらの句の中に組み合わせて、複雑な多重レベルのブール論理を模倣できます。

次の例は、40歳ではあるがID(アイダホ)には住んでいない人の口座をすべて返します。

GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        { "match": { "age": "40" } }
      ],
      "must_not": [
        { "match": { "state": "ID" } }
      ]
    }
  }
}