다음을 통해 공유

模糊搜索以更正拼写错误和输入错误

Azure AI 搜索支持模糊搜索,这是一种查询,用于处理输入字符串中的拼写错误和拼写字词错误。 模糊搜索扫描具有类似结构的词汇。 扩展搜索以包括近似匹配,当差异只是几个错位字符时,能够自动更正拼写错误。

它是一项查询扩展操作,用于匹配具有相似结构的术语。 指定模糊搜索时,搜索引擎将基于确定性有限自动机理论,为查询中所有完整术语的相似术语构建一个图。 例如,如果查询包含三个术语“华盛顿大学”,则会为查询 search=university~ of~ washington~ 中的每个术语创建一个图形(模糊搜索中没有非索引字删除,因此“of”获取图形)。

该图最多包含每个术语的 50 个扩展或排列组合,同时在过程中捕获正确和不正确的变体。 然后,引擎在响应中返回最相关的匹配项。

对于类似“university”这样的词汇,该图可能包括"unversty, universty, university, universe, inverse"。 在图形中匹配的任何文档都包含在结果中。 与其他查询分析文本以处理相同单词的不同形式(例如“mice”和“mouse”)相反,模糊查询中的比较是按表面价值进行的,不需要对文本进行任何语言分析。 “Universe”和“inverse”在语义上虽有不同,但由于语法上的差异很小,仍会匹配。

如果差异限制为两个或更少的编辑,则匹配成功,其中编辑是插入、删除、替换或转置字符。 指定差异的字符串更正算法是 Damerau-Levenshtein 距离指标。 它被描述为“将一个单词更改为另一个单词所需的最少操作次数(插入、删除、替换或者两个相邻字符的调换)”。

在 Azure AI 搜索中:

  • 模糊查询适用于完整词语。 不支持对短语的直接匹配,但可以通过使用 AND 条件为多部分短语中的每个术语指定模糊匹配。 例如,search=dr~ AND cleanin~。 此查询表达式查找“干洗”的匹配项。

  • 编辑的默认距离为 2。 一个~0的值表示没有扩展(只有确切的术语被视为匹配项),但您可以指定~1用于代表一个度的差异或一次编辑。

  • 模糊查询可以将一个术语扩展为最多 50 种变换。 此限制不可配置,但可以通过将编辑距离减少到 1 来有效减少扩展数。

  • 响应由包含相关匹配的文档(最多 50 个)组成。

在查询处理期间,模糊查询不会进行 词法分析。 查询输入直接添加到查询树,并展开以创建术语图。 执行的唯一转换是较低的大小写。

这些图形被集体提交,作为索引中标记的匹配条件。 可以想象,模糊搜索本质上比其他查询表单慢。 索引的大小和复杂性可以确定优势是否足以抵消响应的延迟。

注释

由于模糊搜索往往很慢,因此研究诸如 n-gram 索引的替代方法可能会很有价值。n-gram 索引通过短字符序列(例如 bigram 的二字符序列和 trigram 的三字符序列)实现进展。 根据您的语言和查询界面,n 元语法可能会带来更好的性能。 权衡的代价是,n 元语法索引极其占用存储空间,并生成更大的索引。

另一种选择(如果只想处理最严重的情况)将是 同义词映射。 例如,将“search”映射到“serach”、“serch”、“sarch”,或将“retrieve”映射到“retreive”。

属性为“可搜索”的字符串字段是模糊搜索的候选项。

分析器不用于创建扩展图,但这并不意味着在模糊搜索方案中应忽略分析器。 分析器对于索引编制过程中的标记化非常重要,其中倒排索引中的标记用于与图形匹配。

与往常一样,如果测试查询未生成预期的匹配项,请试验不同的索引分析器。 例如,尝试 语言分析器 以查看是否获得更好的结果。 某些语言(尤其是具有元音突变的语言)可以从 Azure 自然语言处理器生成的拐点和不规则单词形式中获益。 在某些情况下,使用正确的语言分析器可以改变术语是否以与用户提供的值兼容的方式进行标记化。

模糊查询是使用完整的 Lucene 查询语法构造的,调用 完整的 Lucene 查询分析器,并在用户输入的每个整个术语后追加一个波形符 ~

下面是调用模糊搜索的查询请求的示例。 它包括四个术语,其中两个字词拼写错误:

POST https://[service name].search.azure.cn/indexes/hotels-sample-index/docs/search?api-version=2024-07-01
{
    "search": "seatle~ waterfront~ view~ hotle~",
    "queryType": "full",
    "searchMode": "any",
    "searchFields": "HotelName, Description",
    "select": "HotelName, Description, Address/City,",
    "count": "true"
}
  1. 将查询类型设置为完整的 Lucene 语法(queryType=full)。

  2. 提供查询字符串,其中每个术语后跟每个术语末尾的波形符(~)运算符(search=<string>~)。 为查询输入中的每个术语创建扩展图。

    如果要指定编辑距离(~1默认值),请包含可选参数(介于 0 和 2 之间的数字)。 例如,“blue~”或“blue~1”将返回“blue”、“blues”和“glue”。

(可选)可以通过将请求范围限定为特定字段来提高查询性能。 使用 searchFields 参数指定要搜索的字段。 还可以使用该 select 属性指定在查询响应中返回的字段。

对于简单的测试,我们建议 搜索资源管理器REST 客户端 循环访问查询表达式。 这两种工具都是交互式的,这意味着你可以快速尝试术语的多个变体,并评估返回的反馈。

当结果不明确时, 点击突出显示 有助于识别响应中的匹配项。

注释

使用关键词突出显示来识别模糊匹配项的功能有限,并且仅适用于基本的模糊搜索。 如果索引包含评分剖面,或者您对查询应用更复杂的语法层,命中高亮可能无法识别匹配项。

示例 1:使用精确术语的模糊搜索

假设搜索文档中的字段中存在 "Description" 以下字符串: "Test queries with special characters, plus strings for MSFT, SQL and Java."

首先对“special”进行模糊搜索,然后将搜索结果高亮添加到“描述”字段中:

search=special~&highlight=Description

在响应中,由于添加了命中突出显示,因此格式将应用于“特殊”作为匹配字词。

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

再次尝试请求,可通过去掉几个字母将“special”拼错("pe")。

search=scial~&highlight=Description

到目前为止,对响应没有变化。 鉴于默认值为 2 度距离,从“特殊”中删除两个字符 "pe" 仍允许在该术语上成功匹配。

"@search.highlights": {
    "Description": [
        "Test queries with <em>special</em> characters, plus strings for MSFT, SQL and Java."
    ]
}

再尝试一次搜索请求,通过移除最后一个字符来进一步修改搜索词,共计删除三个字符(从“特殊”到 "scal"):

search=scal~&highlight=Description

请注意,返回了相同的响应,但现在模糊匹配的是“SQL”,而不是匹配“special”。

"@search.score": 0.4232868,
"@search.highlights": {
    "Description": [
        "Mix of special characters, plus strings for MSFT, <em>SQL</em>, 2019, Linux, Java."
    ]
}

此扩展示例的要点是说明命中高亮显示可为模糊的结果带来清晰度。 在所有情况下,都会返回同一文档。 如果你依赖文档 ID 来验证匹配,你可能错过了从“特殊”到“SQL”的转变。

另请参阅