Spec-Zone.ru › Elasticsearch 8
›Elasticsearch Guide [8.17] ›Query DSL ›Vector queries

Семантическое запросы

Данная функциональность находится в стадии бета-тестирования и может быть изменена. Дизайн и код менее зрелые, чем официальные функции GA, и предоставляются как есть без каких-либо гарантий. Для бета-функций не действует SLA поддержки, как для официальных функций GA.

Тип запроса semantic позволяет выполнять семантический поиск по данным, хранящимся в поле semantic_text.

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

resp = client.search(
    index="my-index-000001",
    query={
        "semantic": {
            "field": "inference_field",
            "query": "Best surfing places"
        }
    },
)
print(resp)
const response = await client.search({
  index: "my-index-000001",
  query: {
    semantic: {
      field: "inference_field",
      query: "Best surfing places",
    },
  },
});
console.log(response);
GET my-index-000001/_search
{
  "query": {
    "semantic": {
      "field": "inference_field",
      "query": "Best surfing places"
    }
  }
}

Параметры верхнего уровня для semantic

field
(Обязательно, строка) Поле semantic_text для выполнения запроса.
query
(Обязательно, строка) Текст запроса для поиска в поле.

Обратитесь к этому руководству, чтобы узнать больше о семантическом поиске с использованием запроса semantic_text и semantic.

Гибридный поиск с запросом semantic

Запрос semantic может использоваться в качестве части гибридного поиска, где запрос semantic комбинируется с лексическими запросами. Например, запрос ниже находит документы, в которых поле title соответствует "mountain lake", и объединяет их с результатами семантического поиска по полю title_semantic, которое является полем semantic_text. Объединенные документы затем оцениваются, и возвращаются 3 самых высоко оцененных документа.

resp = client.search(
    index="my-index",
    size=3,
    query={
        "bool": {
            "should": [
                {
                    "match": {
                        "title": {
                            "query": "mountain lake",
                            "boost": 1
                        }
                    }
                },
                {
                    "semantic": {
                        "field": "title_semantic",
                        "query": "mountain lake",
                        "boost": 2
                    }
                }
            ]
        }
    },
)
print(resp)
const response = await client.search({
  index: "my-index",
  size: 3,
  query: {
    bool: {
      should: [
        {
          match: {
            title: {
              query: "mountain lake",
              boost: 1,
            },
          },
        },
        {
          semantic: {
            field: "title_semantic",
            query: "mountain lake",
            boost: 2,
          },
        },
      ],
    },
  },
});
console.log(response);
POST my-index/_search
{
  "size" : 3,
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": {
              "query": "mountain lake",
              "boost": 1
            }
          }
        },
        {
          "semantic": {
            "field": "title_semantic",
            "query": "mountain lake",
            "boost": 2
          }
        }
      ]
    }
  }
}

Вы также можете использовать semantic_text как часть взаимного ранжирования слияния для упрощения ранжирования релевантных результатов:

resp = client.search(
    index="my-index",
    retriever={
        "rrf": {
            "retrievers": [
                {
                    "standard": {
                        "query": {
                            "term": {
                                "text": "shoes"
                            }
                        }
                    }
                },
                {
                    "standard": {
                        "query": {
                            "semantic": {
                                "field": "semantic_field",
                                "query": "shoes"
                            }
                        }
                    }
                }
            ],
            "rank_window_size": 50,
            "rank_constant": 20
        }
    },
)
print(resp)
const response = await client.search({
  index: "my-index",
  retriever: {
    rrf: {
      retrievers: [
        {
          standard: {
            query: {
              term: {
                text: "shoes",
              },
            },
          },
        },
        {
          standard: {
            query: {
              semantic: {
                field: "semantic_field",
                query: "shoes",
              },
            },
          },
        },
      ],
      rank_window_size: 50,
      rank_constant: 20,
    },
  },
});
console.log(response);
GET my-index/_search
{
  "retriever": {
    "rrf": {
      "retrievers": [
        {
          "standard": {
            "query": {
              "term": {
                "text": "shoes"
              }
            }
          }
        },
        {
          "standard": {
            "query": {
              "semantic": {
                "field": "semantic_field",
                "query": "shoes"
              }
            }
          }
        }
      ],
      "rank_window_size": 50,
      "rank_constant": 20
    }
  }
}

Расширенный поиск по полям semantic_text

Запрос semantic использует значения по умолчанию для поиска по полям semantic_text для удобства использования. Если вы хотите уточнить поиск по полю semantic_text, вам необходимо знать тип задачи, используемой сервисом inference_id, настроенным в semantic_text. Тип задачи можно найти с помощью API получения информации о выводах и проверить связанный с сервисом вывода task_type. В зависимости от task_type, используйте либо запрос sparse_vector, либо запрос knn для большей гибкости и настройки.

Хотя можно использовать запрос sparse_vector или запрос knn на поле semantic_text, использование запроса semantic_query для полей типа sparse_vector или dense_vector не поддерживается.

Поиск с выводом sparse_embedding

Если конечная точка вывода использует модель sparse_embedding, вы можете использовать запрос sparse_vector на поле semantic_text следующим образом:

GET test-index/_search
{
  "query": {
    "nested": {
      "path": "inference_field.inference.chunks",
      "query": {
        "sparse_vector": {
          "field": "inference_field.inference.chunks.embeddings",
          "inference_id": "my-inference-id",
          "query": "mountain lake"
        }
      }
    }
  }
}

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

Поиск с выводом text_embedding

Если конечная точка вывода использует модель text_embedding, вы можете использовать запрос knn на поле semantic_text следующим образом:

GET test-index/_search
{
  "query": {
    "nested": {
      "path": "inference_field.inference.chunks",
      "query": {
        "knn": {
          "field": "inference_field.inference.chunks.embeddings",
          "query_vector_builder": {
            "text_embedding": {
              "model_id": "my_inference_id",
	      "model_text": "mountain lake"
            }
          }
        }
      }
    }
  }
}

Вы можете настроить запрос knn, включив в него определенные настройки, например num_candidates и k.

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

Spec-Zone.ru

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