在使用Azure AI搜索时出现错误

1 投票
1 回答
61 浏览
提问于 2025-04-14 15:22

我在使用Python开发工具包和前端时遇到了以下错误,尽管我认为我的“可搜索”模式设置得没问题。请给我一些建议,谢谢。

“‘search’参数需要在索引中至少有一个可搜索的文本字段。\r\n参数名称:searchFields”

def simple_hybrid_search():
    # [START simple_hybrid_search]
    query = "classify earthworks"

    search_client = SearchClient(endpoint, index_name, AzureKeyCredential(key))
    vector_query = VectorizedQuery(vector=generate_embeddings(query), k_nearest_neighbors=3, fields="vector")

    results = search_client.search(
        search_text=query,
        vector_queries=[vector_query],
        select=["metadata"],
    )

    for result in results:
        print(result)

fields = [
    SimpleField(name="id", type=SearchFieldDataType.String, key=True, searchable=True),
    SearchField(name="vector",type=SearchFieldDataType.Collection(SearchFieldDataType.Single), searchable=True, vector_search_dimensions=1536, vector_search_profile_name="uniclass-rag-vector-config",),
    ComplexField(name="metadata", fields=[
        SearchableField(name="code", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="group", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="group_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="sub_group", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True), 
        SearchableField(name="sub_group_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="sub_object_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="object_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="classification_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        

在这里输入图片描述

1 个回答

2

根据这份文档,你可以了解到:

混合搜索是将全文搜索和向量查询结合在一起,这些查询会在一个包含可搜索的纯文本内容和生成的嵌入向量的搜索索引上执行。

你需要一个向量字段来进行向量查询,同时需要一个可搜索的文本字段在索引中来进行文本查询,而且不能在子字段中。这两者是并行处理的,最终会给你结果。

你的架构中没有可搜索的文本字段用于search_text,这就是你收到错误提示的原因,提示内容是搜索参数至少需要一个可搜索的文本字段在索引中

另外,如果你注意到,当你只进行向量搜索时,它是成功的,因为你有一个类型为SingleCollection的向量字段,并且你正在传递它。

enter image description here

所以,在你的情况下,解决方案是创建一个包含可搜索字段的索引,并在搜索时,额外提供一个参数search_fields,这个参数是一个包含metadata子字段的列表。

下面是创建索引的代码。

在这里,我将id设置为Searchable

def get_hotel_index(name: str):
    from azure.search.documents.indexes.models import (
        SearchIndex,
        SearchField,
        SearchFieldDataType,
        SimpleField,
        SearchableField,
        ComplexField,
        VectorSearch,
        VectorSearchProfile,
        HnswAlgorithmConfiguration,
    )
    fields = [
    SearchableField(name="id", type=SearchFieldDataType.String, key=True, searchable=True),
    SearchField(name="vector",type=SearchFieldDataType.Collection(SearchFieldDataType.Single), searchable=True, vector_search_dimensions=1536, vector_search_profile_name="uniclass-rag-vector-config",),
    ComplexField(name="metadata", fields=[
        SearchableField(name="code", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="group", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="group_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="sub_group", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True), 
        SearchableField(name="sub_group_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="sub_object_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="object_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),
        SearchableField(name="classification_title", type=SearchFieldDataType.String, nullable=True, searchable=True, filterable=True, sortable=True, facetable=True),])]
    vector_search = VectorSearch(
        profiles=[VectorSearchProfile(name="uniclass-rag-vector-config", algorithm_configuration_name="my-algorithms-config")],
        algorithms=[HnswAlgorithmConfiguration(name="my-algorithms-config")],
    )
    return SearchIndex(name=name, fields=fields, vector_search=vector_search)

还有搜索的代码。

def simple_hybrid_search(query):

    search_client = SearchClient(service_endpoint, index_name, AzureKeyCredential(key))
    vector_query = VectorizedQuery(vector=get_embeddings(query), k_nearest_neighbors=3, fields="vector")

    results = search_client.search(
        search_text=query,
        search_fields=["metadata/code", "metadata/group", "metadata/group_title", "metadata/sub_group", "metadata/sub_group_title", "metadata/sub_object_title", "metadata/title", "metadata/object_title", "metadata/classification_title"],
        vector_queries=[vector_query],
        select=["metadata"],
    )

    for result in results:
        print(result)

simple_hybrid_search("Give me description 3")

输出结果:

enter image description here

撰写回答