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

Запрос term

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

Вы можете использовать запрос term для поиска документов на основе точного значения, такого как цена, идентификатор продукта или имя пользователя.

Избегайте использования запроса term для полей типа text.

По умолчанию Elasticsearch изменяет значения полей text как часть процесса анализа. Это может затруднить поиск точных совпадений для значений полей text.

Для поиска значений полей text используйте запрос match вместо этого.

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

resp = client.search(
    query={
        "term": {
            "user.id": {
                "value": "kimchy",
                "boost": 1
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    query: {
      term: {
        'user.id' => {
          value: 'kimchy',
          boost: 1
        }
      }
    }
  }
)
puts response
const response = await client.search({
  query: {
    term: {
      "user.id": {
        value: "kimchy",
        boost: 1,
      },
    },
  },
});
console.log(response);
GET /_search
{
  "query": {
    "term": {
      "user.id": {
        "value": "kimchy",
        "boost": 1.0
      }
    }
  }
}

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

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

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

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

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

Вы можете использовать параметр boost для корректировки оценок релевантности для поисков, содержащих два или более запросов.

Значения boost являются относительными по отношению к значению по умолчанию 1.0. Значение boost между 0 и 1.0 уменьшает релевантность. Значение больше, чем 1.0, увеличивает релевантность.

case_insensitive [7.10.0] Добавлено в 7.10.0.
(Необязательно, булево) Разрешает нечувствительное к регистру соответствие ASCII значения с индексированными значениями поля, если установлено в true. По умолчанию false, что означает, что чувствительность к регистру соответствия зависит от сопоставления поля.

Примечания

Избегайте использования запроса term для полей text

По умолчанию Elasticsearch изменяет значения полей text во время анализа. Например, стандартный анализатор по умолчанию стандартный анализатор изменяет значения полей text следующим образом:

  • Удаляет большинство знаков препинания
  • Разделяет оставшееся содержимое на отдельные слова, называемые токенами
  • Преобразует токены в нижний регистр

Для лучшего поиска полей text запрос match также анализирует предоставленный вами поисковой термин перед выполнением поиска. Это означает, что запрос match может искать в полях text по анализированным токенам, а не по точному термину.

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

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

  1. Создайте индекс с полем text под названием full_text.

    resp = client.indices.create(
        index="my-index-000001",
        mappings={
            "properties": {
                "full_text": {
                    "type": "text"
                }
            }
        },
    )
    print(resp)
    response = client.indices.create(
      index: 'my-index-000001',
      body: {
        mappings: {
          properties: {
            full_text: {
              type: 'text'
            }
          }
        }
      }
    )
    puts response
    res, err := es.Indices.Create(
    	"my-index-000001",
    	es.Indices.Create.WithBody(strings.NewReader(`{
    	  "mappings": {
    	    "properties": {
    	      "full_text": {
    	        "type": "text"
    	      }
    	    }
    	  }
    	}`)),
    )
    fmt.Println(res, err)
    const response = await client.indices.create({
      index: "my-index-000001",
      mappings: {
        properties: {
          full_text: {
            type: "text",
          },
        },
      },
    });
    console.log(response);
    PUT my-index-000001
    {
      "mappings": {
        "properties": {
          "full_text": { "type": "text" }
        }
      }
    }
  2. Добавьте документ со значением Quick Brown Foxes! в поле full_text.

    resp = client.index(
        index="my-index-000001",
        id="1",
        document={
            "full_text": "Quick Brown Foxes!"
        },
    )
    print(resp)
    response = client.index(
      index: 'my-index-000001',
      id: 1,
      body: {
        full_text: 'Quick Brown Foxes!'
      }
    )
    puts response
    res, err := es.Index(
    	"my-index-000001",
    	strings.NewReader(`{
    	  "full_text": "Quick Brown Foxes!"
    	}`),
    	es.Index.WithDocumentID("1"),
    	es.Index.WithPretty(),
    )
    fmt.Println(res, err)
    const response = await client.index({
      index: "my-index-000001",
      id: 1,
      document: {
        full_text: "Quick Brown Foxes!",
      },
    });
    console.log(response);
    PUT my-index-000001/_doc/1
    {
      "full_text":   "Quick Brown Foxes!"
    }

    Так как поле full_text является полем text, Elasticsearch изменяет Quick Brown Foxes! на [quick, brown, fox] во время анализа.

  3. Используйте запрос term для поиска Quick Brown Foxes! в поле full_text. Включите параметр pretty для лучшей читаемости ответа.

    resp = client.search(
        index="my-index-000001",
        pretty=True,
        query={
            "term": {
                "full_text": "Quick Brown Foxes!"
            }
        },
    )
    print(resp)
    response = client.search(
      index: 'my-index-000001',
      pretty: true,
      body: {
        query: {
          term: {
            full_text: 'Quick Brown Foxes!'
          }
        }
      }
    )
    puts response
    res, err := es.Search(
    	es.Search.WithIndex("my-index-000001"),
    	es.Search.WithBody(strings.NewReader(`{
    	  "query": {
    	    "term": {
    	      "full_text": "Quick Brown Foxes!"
    	    }
    	  }
    	}`)),
    	es.Search.WithPretty(),
    )
    fmt.Println(res, err)
    const response = await client.search({
      index: "my-index-000001",
      pretty: "true",
      query: {
        term: {
          full_text: "Quick Brown Foxes!",
        },
      },
    });
    console.log(response);
    GET my-index-000001/_search?pretty
    {
      "query": {
        "term": {
          "full_text": "Quick Brown Foxes!"
        }
      }
    }

    Так как поле full_text больше не содержит точный термин Quick Brown Foxes!, запрос term не возвращает результатов.

  4. Используйте запрос match для поиска Quick Brown Foxes! в поле full_text.

    resp = client.search(
        index="my-index-000001",
        pretty=True,
        query={
            "match": {
                "full_text": "Quick Brown Foxes!"
            }
        },
    )
    print(resp)
    response = client.search(
      index: 'my-index-000001',
      pretty: true,
      body: {
        query: {
          match: {
            full_text: 'Quick Brown Foxes!'
          }
        }
      }
    )
    puts response
    res, err := es.Search(
    	es.Search.WithIndex("my-index-000001"),
    	es.Search.WithBody(strings.NewReader(`{
    	  "query": {
    	    "match": {
    	      "full_text": "Quick Brown Foxes!"
    	    }
    	  }
    	}`)),
    	es.Search.WithPretty(),
    )
    fmt.Println(res, err)
    const response = await client.search({
      index: "my-index-000001",
      pretty: "true",
      query: {
        match: {
          full_text: "Quick Brown Foxes!",
        },
      },
    });
    console.log(response);
    GET my-index-000001/_search?pretty
    {
      "query": {
        "match": {
          "full_text": "Quick Brown Foxes!"
        }
      }
    }

    В отличие от запроса term, запрос match анализирует предоставленный вами поисковой термин Quick Brown Foxes! перед выполнением поиска. Затем запрос match возвращает все документы, содержащие токены quick, brown или fox в поле full_text.

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

    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 0.8630463,
        "hits" : [
          {
            "_index" : "my-index-000001",
            "_id" : "1",
            "_score" : 0.8630463,
            "_source" : {
              "full_text" : "Quick Brown Foxes!"
            }
          }
        ]
      }
    }

© 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-term-query.html

Spec-Zone.ru

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