Combined fields

combined_fields クエリは、複数のテキストフィールドを、内容が1つの結合フィールドにインデックスされたかのように検索することをサポートします。このクエリは、入力文字列の用語中心のビューを取ります。最初にクエリ文字列を個々の用語に分析し、その後、任意のフィールド内で各用語を探します。このクエリは、titleabstract、および body のように、マッチが複数のテキストフィールドにまたがる可能性がある場合に特に便利です。

Python

  1. resp = client.search(
  2. query={
  3. "combined_fields": {
  4. "query": "database systems",
  5. "fields": [
  6. "title",
  7. "abstract",
  8. "body"
  9. ],
  10. "operator": "and"
  11. }
  12. },
  13. )
  14. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. combined_fields: {
  5. query: 'database systems',
  6. fields: [
  7. 'title',
  8. 'abstract',
  9. 'body'
  10. ],
  11. operator: 'and'
  12. }
  13. }
  14. }
  15. )
  16. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. combined_fields: {
  4. query: "database systems",
  5. fields: ["title", "abstract", "body"],
  6. operator: "and",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "combined_fields" : {
  5. "query": "database systems",
  6. "fields": [ "title", "abstract", "body"],
  7. "operator": "and"
  8. }
  9. }
  10. }

The combined_fields クエリは、The Probabilistic Relevance Framework: BM25 and Beyond で説明されているシンプルな BM25F フォーミュラに基づいてスコアリングに対する原則的なアプローチを取ります。マッチのスコアリングを行う際、クエリはフィールド間で用語とコレクションの統計を組み合わせて、指定されたフィールドが1つの結合フィールドにインデックスされたかのように各マッチのスコアを計算します。このスコアリングは最善の試みであり、combined_fields はいくつかの近似を行い、スコアは BM25F モデルに完全には従いません。

Field number limit

デフォルトでは、クエリが含むことができる句の数に制限があります。この制限は、indices.query.bool.max_clause_count 設定によって定義されており、デフォルトは 4096 です。結合フィールドクエリの場合、句の数はフィールドの数と用語の数を掛けたものとして計算されます。

Per-field boosting

フィールドブーストは、結合フィールドモデルに従って解釈されます。たとえば、title フィールドにブーストが2の場合、スコアはタイトル内の各用語が合成された結合フィールドに2回出現するかのように計算されます。

Python

  1. resp = client.search(
  2. query={
  3. "combined_fields": {
  4. "query": "distributed consensus",
  5. "fields": [
  6. "title^2",
  7. "body"
  8. ]
  9. }
  10. },
  11. )
  12. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. combined_fields: {
  5. query: 'distributed consensus',
  6. fields: [
  7. 'title^2',
  8. 'body'
  9. ]
  10. }
  11. }
  12. }
  13. )
  14. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. combined_fields: {
  4. query: "distributed consensus",
  5. fields: ["title^2", "body"],
  6. },
  7. },
  8. });
  9. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "combined_fields" : {
  5. "query" : "distributed consensus",
  6. "fields" : [ "title^2", "body" ]
  7. }
  8. }
  9. }
個々のフィールドは、キャレット (^) 表記を使用してブーストできます。

combined_fields クエリは、フィールドブーストが1.0以上であることを要求します。フィールドブーストは小数であることが許可されています。

Top-level parameters for combined_fields

  • fields
  • (必須、文字列の配列) 検索するフィールドのリスト。フィールドのワイルドカードパターンが許可されています。サポートされているのは、text フィールドのみで、すべて同じ検索 analyzer を持っている必要があります。
  • query
  • (必須、文字列) 提供された <fields> で検索するテキスト。
    combined_fields クエリは、検索を実行する前に提供されたテキストを analyzes します。
  • auto_generate_synonyms_phrase_query
  • (オプション、Boolean) true の場合、match phrase クエリが自動的に作成されます。デフォルトは true です。
    Use synonyms with match query の例を参照してください。
  • operator
  • (オプション、文字列) query 値内のテキストを解釈するために使用されるブール論理。有効な値は次のとおりです:
    • or (デフォルト)
    • たとえば、query 値が database systems の場合、database OR systems として解釈されます。
    • and
    • たとえば、query 値が database systems の場合、database AND systems として解釈されます。
  • minimum_should_match
  • (オプション、文字列) ドキュメントが返されるために一致する必要がある最小句の数。 minimum_should_match パラメータ の有効な値と詳細情報を参照してください。
  • zero_terms_query
  • (オプション、文字列) analyzer がすべてのトークンを削除する場合、ドキュメントが返されないかどうかを示します。たとえば、stop フィルターを使用する場合。 有効な値は次のとおりです:
    • none (デフォルト)
    • analyzer がすべてのトークンを削除する場合、ドキュメントは返されません。
    • all
    • すべてのドキュメントが返されます。これは、match_all クエリに似ています。
      Zero terms query の例を参照してください。

Comparison to multi_match query

combined_fields クエリは、複数の text フィールドにわたるマッチングとスコアリングの原則的な方法を提供します。これをサポートするために、すべてのフィールドが同じ検索 analyzer を持っている必要があります。

異なるタイプのフィールド(キーワードや数値など)を処理する単一のクエリが必要な場合は、multi_match クエリの方が適しているかもしれません。これは、テキストフィールドと非テキストフィールドの両方をサポートし、同じアナライザーを共有しないテキストフィールドも受け入れます。

主な multi_match モード best_fieldsmost_fields は、クエリのフィールド中心のビューを取ります。それに対して、combined_fields は用語中心です: operatorminimum_should_match は、フィールドごとではなく、用語ごとに適用されます。具体的には、次のようなクエリが

Python

  1. resp = client.search(
  2. query={
  3. "combined_fields": {
  4. "query": "database systems",
  5. "fields": [
  6. "title",
  7. "abstract"
  8. ],
  9. "operator": "and"
  10. }
  11. },
  12. )
  13. print(resp)

Ruby

  1. response = client.search(
  2. body: {
  3. query: {
  4. combined_fields: {
  5. query: 'database systems',
  6. fields: [
  7. 'title',
  8. 'abstract'
  9. ],
  10. operator: 'and'
  11. }
  12. }
  13. }
  14. )
  15. puts response

Js

  1. const response = await client.search({
  2. query: {
  3. combined_fields: {
  4. query: "database systems",
  5. fields: ["title", "abstract"],
  6. operator: "and",
  7. },
  8. },
  9. });
  10. console.log(response);

Console

  1. GET /_search
  2. {
  3. "query": {
  4. "combined_fields" : {
  5. "query": "database systems",
  6. "fields": [ "title", "abstract"],
  7. "operator": "and"
  8. }
  9. }
  10. }

は次のように実行されます:

Txt

  1. +(combined("database", fields:["title" "abstract"]))
  2. +(combined("systems", fields:["title", "abstract"]))

言い換えれば、各用語はドキュメントが一致するために少なくとも1つのフィールドに存在する必要があります。

cross_fields multi_match モードも用語中心のアプローチを取り、operatorminimum_should_match per-term を適用します。combined_fields の主な利点は、BM25F アルゴリズムに基づくスコアリングに対する堅牢で解釈可能なアプローチです。

Custom similarities

combined_fields クエリは現在、BM25 類似性のみをサポートしており、カスタム類似性 が構成されていない限り、デフォルトとなります。フィールドごとの類似性 も許可されていません。これらのいずれかのケースで combined_fields を使用すると、エラーが発生します。