Недавно я обновил свой экземпляр Azure Cognitive Search, чтобы в нем появился семантический поиск.
Однако, когда я добавляю query_type=semantic, в поиске клиента я получаю следующую трассировку стека...
Traceback (most recent call last):
File "call_semantic_search.py", line 34, in <module>
c, r = main(search_text='what is a ')
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "call_semantic_search.py", line 28, in main
count: float = search_results.get_count()
^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/azure/search/documents/_paging.py", line 82, in get_count
return self._first_iterator_instance().get_count()
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/azure/search/documents/_paging.py", line 91, in wrapper
self._response = self._get_next(self.continuation_token)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/azure/search/documents/_paging.py", line 115, in _get_next_cb
return self._client.documents.search_post(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File ".venv/lib/python3.11/site-packages/azure/search/documents/_generated/operations/_documents_operations.py", line 312, in search_post
raise HttpResponseError(response=response, model=error)
azure.core.exceptions.HttpResponseError: () The request is invalid. Details: parameters : Requested value 'semantic' was not found.
Code:
Message: The request is invalid. Details: parameters : Requested value 'semantic' was not found.
Это код, который я использовал для вызова поискового индекса.
import logging
from typing import Dict, Iterable, Tuple
import settings as settings
from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient
from search import SearchableItem
TOP = 10
SKIP = 0
def main(search_text: str) -> Tuple[float, Iterable[Dict]]:
client = SearchClient(
api_version = "2021-04-30-Preview",
endpoint=settings.SEARCH_SERVICE_ENDPOINT,
index_name=settings.SOCIAL_IDX_NAME,
credential=AzureKeyCredential(key=settings.SEARCH_SERVICE_KEY)
)
logging.info(f"Calling: /search?top = {TOP}&skip = {SKIP}&q = {search_text}")
search_results = client.search(
search_text=search_text,
top=TOP,
skip=SKIP,
query_type = "semantic",
include_total_count=True,
)
count: float = search_results.get_count()
results = SearchableItem.from_result_as_dict(search_results)
return count, results
if __name__ == "__main__":
count, results = main(search_text='what is a ')
print(count, list(results))
А вот моя конфигурация Azure (я могу выполнять семантический поиск через портал:
Следуя совету @Thiago Custodio;
Я включил ведение журнала с помощью:
import sys
logger = logging.getLogger('azure')
logger.setLevel(logging.DEBUG)
# Configure a console output
handler = logging.StreamHandler(stream=sys.stdout)
logger.addHandler(handler)
# ...
search_results = client.search(
search_text=search_text,
top=TOP,
skip=SKIP,
query_type = "semantic",
include_total_count=True,
logging_enable=True
)
# ...
И я получил следующее:
DEBUG:azure.core.pipeline.policies._universal:Request URL: 'https://search.windows.net//indexes('idx-name')/docs/search.post.search?api-version=2020-06-30'
Request method: 'POST'
Request headers:
'Content-Type': 'application/json'
'Accept': 'application/json;odata.metadata=none'
'Content-Length': '86'
'x-ms-client-request-id': 'fbaafc9e-qwww-11ed-9117-a69cwa6c72e'
'api-key': '***'
'User-Agent': 'azsdk-python-search-documents/11.3.0 Python/3.11.1 (macOS-13.0-x86_64-i386-64bit)'
Таким образом, это показывает, что исходящий URL-адрес запроса привязан к api-version=2020-06-30
— на портале Azure, если я изменю версию поиска на ту же, семантический поиск будет недоступен.
Кажется, у меня устаревшая версия библиотеки поиска, хотя я установил через:
pip install azure-search-documents
Наиболее заметным отличием является то, что в моем локальном azure/search/documents/_generated/operations/_documents_operations.py
- api_version
, кажется, жестко запрограммировано на 2020-06-30
см.:
Глядя на источник, мне на самом деле нужно, чтобы api_version
устанавливался динамически, поэтому вызывающему абоненту я могу передать его в клиенте поиска. Это то, что уже реализовано в основной ветке исходного кода, см.: Исходный код, но по какой-то причине моя локальная версия отличается
из вашего кода:
search_results = client.search(
search_text=search_text,
top=TOP,
skip=SKIP,
query_type = "semantic",
include_total_count=True,
)
Семантический поиск — это не параметр, а конечная точка. Вместо того, чтобы звонить /search
, вы должны вызвать /semantic
это то, что вам нужно:
def semantic_ranking():
# [START semantic_ranking]
from azure.core.credentials import AzureKeyCredential
from azure.search.documents import SearchClient
endpoint = os.getenv("AZURE_SEARCH_SERVICE_ENDPOINT")
index_name = os.getenv("AZURE_SEARCH_INDEX_NAME")
api_key = os.getenv("AZURE_SEARCH_API_KEY")
credential = AzureKeyCredential(api_key)
client = SearchClient(endpoint=endpoint,
index_name=index_name,
credential=credential)
results = list(client.search(search_text = "luxury", query_type = "semantic", query_language = "en-us"))
примечание: часть query_type в последней строке
Основываясь на ваших изменениях, я чувствую, что мой код и ваш код одинаковы.
Возможно, вы тоже используете старую библиотеку поиска. Я бы сделал: попробуйте выполнить поиск с помощью REST, а затем попробуйте сопоставить все, что делает эта библиотека. Распечатайте запрос, если это возможно, и сравните оба
Исправлено с:
azure-search-documents==11.4.0b3
Вы можете опубликовать Python? Я следил за этим: github.com/Azure/azure-sdk-for-python/blob/main/sdk/search/…