Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Query DSL ›Запросы на уровне терминов

Запрос набора терминов

Возвращает документы, содержащие минимальное количество точных терминов в указанном поле.

Запрос terms_set аналогичен запросу terms, за исключением того, что вы можете определить количество необходимых совпадающих терминов для возврата документа. Например:

  • Поле programming_languages содержит список известных языков программирования, таких как c++, java или php для кандидатов на работу. Вы можете использовать запрос terms_set для возврата документов, соответствующих как минимум двум из этих языков.
  • Поле permissions содержит список возможных разрешений пользователя для приложения. Вы можете использовать запрос terms_set для возврата документов, соответствующих подмножеству этих разрешений.

Пример запроса

Настройка индекса

В большинстве случаев для использования запроса terms_set необходимо включить отображение числового поля в вашем индексе. Это числовое поле содержит количество совпадающих терминов, необходимых для возврата документа.

Чтобы увидеть, как настроить индекс для запроса terms_set, рассмотрите следующий пример.

  1. Создайте индекс job-candidates со следующими отображениями полей:

    • name, поле keyword. Это поле содержит имя кандидата на должность.
    • programming_languages, поле keyword. Это поле содержит языки программирования, известные кандидату на должность.
    • required_matches, числовое поле long. Это поле содержит количество совпадающих терминов, необходимых для возврата документа.
    resp = client.indices.create(
        index="job-candidates",
        mappings={
            "properties": {
                "name": {
                    "type": "keyword"
                },
                "programming_languages": {
                    "type": "keyword"
                },
                "required_matches": {
                    "type": "long"
                }
            }
        },
    )
    print(resp)
    response = client.indices.create(
      index: 'job-candidates',
      body: {
        mappings: {
          properties: {
            name: {
              type: 'keyword'
            },
            programming_languages: {
              type: 'keyword'
            },
            required_matches: {
              type: 'long'
            }
          }
        }
      }
    )
    puts response
    const response = await client.indices.create({
      index: "job-candidates",
      mappings: {
        properties: {
          name: {
            type: "keyword",
          },
          programming_languages: {
            type: "keyword",
          },
          required_matches: {
            type: "long",
          },
        },
      },
    });
    console.log(response);
    PUT /job-candidates
    {
      "mappings": {
        "properties": {
          "name": {
            "type": "keyword"
          },
          "programming_languages": {
            "type": "keyword"
          },
          "required_matches": {
            "type": "long"
          }
        }
      }
    }
  2. Добавьте документ с ID 1 и следующими значениями:

    • Jane Smith в поле name.
    • ["c++", "java"] в поле programming_languages.
    • 2 в поле required_matches.

    Включите параметр ?refresh, чтобы документ был немедленно доступен для поиска.

    resp = client.index(
        index="job-candidates",
        id="1",
        refresh=True,
        document={
            "name": "Jane Smith",
            "programming_languages": [
                "c++",
                "java"
            ],
            "required_matches": 2
        },
    )
    print(resp)
    response = client.index(
      index: 'job-candidates',
      id: 1,
      refresh: true,
      body: {
        name: 'Jane Smith',
        programming_languages: [
          'c++',
          'java'
        ],
        required_matches: 2
      }
    )
    puts response
    const response = await client.index({
      index: "job-candidates",
      id: 1,
      refresh: "true",
      document: {
        name: "Jane Smith",
        programming_languages: ["c++", "java"],
        required_matches: 2,
      },
    });
    console.log(response);
    PUT /job-candidates/_doc/1?refresh
    {
      "name": "Jane Smith",
      "programming_languages": [ "c++", "java" ],
      "required_matches": 2
    }
  3. Добавьте другой документ с ID 2 и следующими значениями:

    • Jason Response в поле name.
    • ["java", "php"] в поле programming_languages.
    • 2 в поле required_matches.
    resp = client.index(
        index="job-candidates",
        id="2",
        refresh=True,
        document={
            "name": "Jason Response",
            "programming_languages": [
                "java",
                "php"
            ],
            "required_matches": 2
        },
    )
    print(resp)
    response = client.index(
      index: 'job-candidates',
      id: 2,
      refresh: true,
      body: {
        name: 'Jason Response',
        programming_languages: [
          'java',
          'php'
        ],
        required_matches: 2
      }
    )
    puts response
    const response = await client.index({
      index: "job-candidates",
      id: 2,
      refresh: "true",
      document: {
        name: "Jason Response",
        programming_languages: ["java", "php"],
        required_matches: 2,
      },
    });
    console.log(response);
    PUT /job-candidates/_doc/2?refresh
    {
      "name": "Jason Response",
      "programming_languages": [ "java", "php" ],
      "required_matches": 2
    }

Теперь вы можете использовать значение поля required_matches в качестве количества совпадающих терминов, необходимых для возврата документа в запросе terms_set.

Пример запроса

Следующий поиск возвращает документы, где поле programming_languages содержит как минимум два из следующих терминов:

  • c++
  • java
  • php

Запрос minimum_should_match_field является required_matches. Это означает, что необходимое количество совпадающих терминов равно 2, значению поля required_matches.

resp = client.search(
    index="job-candidates",
    query={
        "terms_set": {
            "programming_languages": {
                "terms": [
                    "c++",
                    "java",
                    "php"
                ],
                "minimum_should_match_field": "required_matches"
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'job-candidates',
  body: {
    query: {
      terms_set: {
        programming_languages: {
          terms: [
            'c++',
            'java',
            'php'
          ],
          minimum_should_match_field: 'required_matches'
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "job-candidates",
  query: {
    terms_set: {
      programming_languages: {
        terms: ["c++", "java", "php"],
        minimum_should_match_field: "required_matches",
      },
    },
  },
});
console.log(response);
GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_field": "required_matches"
      }
    }
  }
}

Параметры верхнего уровня для запроса terms_set

<field>
(Обязательно, объект) Поле, которое вы хотите искать.

Параметры для запроса <field>

terms

(Обязательно, массив) Массив терминов, которые вы хотите найти в указанном поле <field>. Для возврата документа необходимое количество терминов должно точно совпадать со значениями поля, включая пробелы и регистр.

Необходимое количество совпадающих терминов определяется параметрами minimum_should_match, minimum_should_match_field или minimum_should_match_script. Должен быть указан ровно один из этих параметров.

minimum_should_match

(Необязательно) Указание количества совпадающих терминов, необходимых для возврата документа.

Допустимые значения см. в параметре minimum_should_match.

minimum_should_match_field
(Необязательно, строка) Числовое поле содержащее количество совпадающих терминов, необходимых для возврата документа.
minimum_should_match_script

(Необязательно, строка) Пользовательский скрипт, содержащий количество совпадающих терминов, необходимых для возврата документа.

Для параметров и допустимых значений см. Скрипты.

Пример запроса с использованием параметра minimum_should_match_script см. в How to use the параметр minimum_should_match_script.

Примечания

Как использовать параметр minimum_should_match_script

Вы можете использовать minimum_should_match_script для определения требуемого количества совпадающих терминов с помощью скрипта. Это полезно, если вам нужно динамически задать количество необходимых терминов.

Пример запроса с использованием параметра minimum_should_match_script

Следующий поиск возвращает документы, где поле programming_languages содержит как минимум два из следующих терминов:

  • c++
  • java
  • php

Параметр source этого запроса указывает:

  • Необходимое количество совпадающих терминов не может превышать params.num_terms, количество терминов, предоставленных в поле terms.
  • Необходимое количество совпадающих терминов равно 2, значению поля required_matches.
resp = client.search(
    index="job-candidates",
    query={
        "terms_set": {
            "programming_languages": {
                "terms": [
                    "c++",
                    "java",
                    "php"
                ],
                "minimum_should_match_script": {
                    "source": "Math.min(params.num_terms, doc['required_matches'].value)"
                },
                "boost": 1
            }
        }
    },
)
print(resp)
response = client.search(
  index: 'job-candidates',
  body: {
    query: {
      terms_set: {
        programming_languages: {
          terms: [
            'c++',
            'java',
            'php'
          ],
          minimum_should_match_script: {
            source: "Math.min(params.num_terms, doc['required_matches'].value)"
          },
          boost: 1
        }
      }
    }
  }
)
puts response
const response = await client.search({
  index: "job-candidates",
  query: {
    terms_set: {
      programming_languages: {
        terms: ["c++", "java", "php"],
        minimum_should_match_script: {
          source: "Math.min(params.num_terms, doc['required_matches'].value)",
        },
        boost: 1,
      },
    },
  },
});
console.log(response);
GET /job-candidates/_search
{
  "query": {
    "terms_set": {
      "programming_languages": {
        "terms": [ "c++", "java", "php" ],
        "minimum_should_match_script": {
          "source": "Math.min(params.num_terms, doc['required_matches'].value)"
        },
        "boost": 1.0
      }
    }
  }
}

© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/8.17/query-dsl-terms-set-query.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API