Azure AI 搜索中的 OData 全文搜索函数 - search.ismatchsearch.ismatchscoring

Azure AI 搜索支持使用 search.ismatchsearch.ismatchscoring 函数在 OData 筛选器表达式上下文中进行全文搜索。 可以通过这些函数将全文搜索与严格的布尔筛选配合使用,所用方式在仅仅使用 搜索 API 的顶级 search 参数的情况下无法实现。

注意

search.ismatchsearch.ismatchscoring 函数只在搜索 API 的筛选器中受支持。 它们在建议 API 或自动完成 API 中不受支持。

语法

以下 EBNF(扩展巴科斯-瑙尔范式)定义了 search.ismatchsearch.ismatchscoring 函数的语法:

search_is_match_call ::=
    'search.ismatch'('scoring')?'(' search_is_match_parameters ')'

search_is_match_parameters ::=
    string_literal(',' string_literal(',' query_type ',' search_mode)?)?

query_type ::= "'full'" | "'simple'"

search_mode ::= "'any'" | "'all'"

下面还提供了交互式语法图:

注意

请参阅适用于 Azure AI 搜索的 OData 表达式语法参考以获取完整的 EBNF。

search.ismatch

search.ismatch 函数将全文搜索查询作为筛选表达式的一部分进行求值。 与搜索查询匹配的文档将在结果集中返回。 此函数的以下重载可用:

  • search.ismatch(search)
  • search.ismatch(search, searchFields)
  • search.ismatch(search, searchFields, queryType, searchMode)

下表定义了这些参数:

参数名称 类型 说明
search Edm.String 搜索查询(采用简单完整 Lucene 查询语法)。
searchFields Edm.String 要在其中进行搜索的可搜索字段的逗号分隔列表;默认为索引中的所有可搜索字段。 在 search 参数中使用字段搜索时,在 Lucene 查询中指定的字段会覆盖在此参数中指定的任何字段。
queryType Edm.String 'simple''full';默认为 'simple'。 指定 search 参数中使用的查询语言。
searchMode Edm.String 'any''all',默认为 'any'。 指示必须匹配 search 参数中的任意搜索词还是全部搜索词才能将文档视为匹配。 在 search 参数中使用 Lucene 布尔运算符时,这些运算符的优先级高于该参数。

所有上述参数均相当于搜索 API 中的相应搜索请求参数

search.ismatch 函数返回类型为 Edm.Boolean 的值,这样你就可以使用布尔逻辑运算符通过其他筛选器子表达式对其进行编辑。

注意

Azure AI 搜索不支持在 lambda 表达式中使用 search.ismatchsearch.ismatchscoring。 这意味着,如果对象集合可以将全文搜索匹配项与同一对象上严格的筛选器匹配项相关联,则不能基于该对象集合编写筛选器。 若要更详细地了解此限制和相关示例,请参阅排查 Azure AI 搜索中的集合筛选器问题。 若要更深入地了解为何存在此限制,请参阅了解 Azure AI 搜索中的集合筛选器

search.ismatchscoring

search.ismatch 函数一样,对于与作为参数传递的全文搜索查询匹配的文档,search.ismatchscoring 函数会返回 true。 它们之间的区别在于,与 search.ismatchscoring 查询匹配的文档的相关性分数与文档整体分数有关,而对于 search.ismatch,文档分数不会发生更改。 此函数的以下重载可用于与 search.ismatch 的参数相同的参数:

  • search.ismatchscoring(search)
  • search.ismatchscoring(search, searchFields)
  • search.ismatchscoring(search, searchFields, queryType, searchMode)

可以在同一筛选器表达式中使用 search.ismatchsearch.ismatchscoring 函数。

示例

查找包含“waterfront”一词的文档。 此筛选器查询与包含 search=waterfront搜索请求相同。

    search.ismatchscoring('waterfront')

查找带有“hostel”一词且评分大于或等于 4 分的文档,或带有“motel”一词且评分等于 5 分的文档。 请注意,如果没有 search.ismatchscoring 函数,则无法表达此请求。

    search.ismatchscoring('hostel') and Rating ge 4 or search.ismatchscoring('motel') and Rating eq 5

查找没有“luxury”一词的文档。

    not search.ismatch('luxury')

查找包含短语“ocean view”或评分等于 5 分的文档。 search.ismatchscoring 查询仅针对 HotelNameRooms/Description 字段执行。

仅与析取的第二个子句匹配的文档也将被返回,即 Rating 等于 5 分的酒店。 为了清楚地表明这些文档与表达式的任何得分部分都不匹配,它们返回的分数将为零。

    search.ismatchscoring('"ocean view"', 'Rooms/Description,HotelName') or Rating eq 5

在酒店描述中查找词条“hotel”和“airport”相距不超过 5 个字词且不允许吸烟(至少部分房间是这样)的文档。 此查询使用完整 Lucene 查询语言

    search.ismatch('"hotel airport"~5', 'Description', 'full', 'any') and Rooms/any(room: not room/SmokingAllowed)

查找在“说明”字段中包含以字母“lux”开头的单词的文档。 此查询结合使用前缀搜索search.ismatch

    search.ismatch('lux*', 'Description')

后续步骤