web-dev-qa-db-ja.com

Elasticsearchで複数のフィールドを検索する

Elasticsearchは初めてであり、1つ以上のフィールドを指定して検索を行う方法を知りたいと思っています。

SQLを使用して、次のクエリを作成します。

"SELECT field1, field2, field3 FROM tablename WHERE field1 = 'X' AND field2 != 'Y' AND field3 = 'Z'"

Elasticsearchでは、これから始めています:

{
    "query": {
        "filtered": {
            "query": {
                "query_string": {
                    "query": "*"
                }
            },
            "filter": {
                "term" : {
                    "field1" : "286"
                }
            }
        }
    }
}
28
Pennywise83

ジョブに適切なクエリを選択する必要がありますが、最初は難しい場合があります。すでに提案したように、boolクエリを使用して、あらゆる種類の異なるクエリを組み合わせることができます。複数のフィールドで実行できるクエリもあり、内部でブールクエリにマップされます。また、 用語クエリ は、テキスト分析をサポートしていないため、実稼働システムではそれほど一般的ではありませんが、通常、フィールドをインデックス付けした方法と同様の方法でクエリを分析する必要がありますクエリしています。

Elasticsearchで最も一般的なクエリの1つは、単一のフィールドで機能する一致クエリです。また、 multi_match と呼ばれる、複数のフィールドでも機能するまったく同じオプションを持つ別のクエリがあります。これらのクエリはテキスト分析をサポートし、非常にうまく機能します。たとえば、query_stringクエリで使用することをお勧めします。これは、はるかに強力ですが、必要な解析プロセスのためにエラーが発生しやすくなります。 query_stringは、その機能の1つが特に必要な場合(たとえば、クエリ自体にフィールド名またはブール演算子を指定する場合)にのみ使用し、それ以外の場合は一致クエリに使用します。

また、クエリとフィルターの違いを理解することも重要です。詳細については、 here を参照してください。

そして、 クエリDSL で利用可能なすべてのクエリを見て、それらをいじって、あなたができるすべてのさまざまなことを感じてください。

26
javanna

SQLクエリは次と同等です。

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "field1": "X"
          }
        },
        {
          "term": {
            "field3": "Z"
          }
        }
      ],
      "must_not": {
        "term": {
          "field2": "Y"
        }
      }
    }
  }
}

いずれにせよ、もしあなたが新しいなら、elasticsearchを始める前にドキュメントを少し読むことをお勧めします。

クエリには多くの種類があり、それらの一部はデータのインデックス方法に依存します。たとえば、文字列の場合、インデックス時に文字列(小文字、語幹、ストップワードの削除など)を分析できます。インデックス時にフィールドを分析して小文字に変換すると、私が投稿したクエリはfield1が「X」であるドキュメントとは一致しません。

Elasticsearchが少し良くなったら、クエリを改善するためにフィルターを使用できます。

34
moliware

ElasticのSimpleクエリから始めることをお勧めします。 SQLに似ており、理解が容易です。リンク: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-simple-query-string-query.html

クエリ構文は次のようになります。名前がJohn、姓がDoeのゲストを見つけようとしている場合:

GET /_search
{
  "query": {
    "simple_query_string" : {
        "query": "John + Doe",
        "fields": ["guest"],
        "default_operator": "and"
    }
  }
}

この基準のいずれかが一致しない場合、クエリはヒットを返しません。また、ここでは複数のフィールドを検索できますが、1つのフィールドを検索するよりも遅くなります。また、ドキュメントごとに、単純なクエリは論理記号\検索演算子として特別な記号をサポートしています。

 '+' signifies AND operation | signifies OR operation
 '-' negates a single token " wraps a number of tokens to signify a phrase for searching
 '*' at the end of a term signifies a prefix query
0
stinger