在Azure AI 搜索中创建查询时,可以选择使用专用查询表单的完整 Lucene Query Parser 语法:通配符、模糊搜索、邻近搜索、正则表达式。 除了 表达式构造的范围搜索之外,Lucene 查询解析器的大部分语法在 Azure AI 搜索 中都被完整实现。
若要使用完整的 Lucene 语法,请将 queryType 设置为full,并传入为通配符、模糊搜索或由完整语法支持的其他查询形式之一模式化的查询表达式。 在 REST 中,search请求的参数中提供查询表达式。
示例(完整语法)
下面的示例是一个使用完整语法构造的搜索请求。 这个示例演示了字段搜索和短语加权。 查找类别字段中包含“budget”这一字词的酒店。 包含短语 "recently renovated" 的文档会收到额外的提升权重,并且可能会因短语提升值(3)而排名更高。
POST /indexes/hotels-sample/docs/search?api-version=2026-04-01
{
"queryType": "full",
"search": "category:budget AND \"recently renovated\"^3",
"searchMode": "all"
}
searchMode 参数虽然不特定于任何查询类型,但在本例中却是相关的。 无论运算符何时出现在查询上,通常都应该设置 searchMode=all 以确保匹配所有条件。
有关更多示例,请参阅 Lucene 查询语法示例。 有关查询请求和参数(包括 searchMode)的详细信息,请参阅搜索文档 (REST API)。
语法基础知识
下面的语法基础适用于所有使用 Lucene 语法的查询。
上下文中的运算符评估
位置决定符号解释为运算符或者解释为字符串中的另一个字符。
例如,Lucene 完整语法中,波浪线 (~) 用于模糊搜索和邻近搜索。 如果放在引用短语之后,~ 调用邻近搜索。 如果放在字词末尾,~ 调用模糊搜索。
在术语中,例如“business~analyst”,字符不被当作运算符。 在此情况下,假设查询是字词或短语查询,则使用词法分析的全文搜索会删除 ~ 并将字词“business~analyst”分为两部分:business 或 analyst。
上面的示例是波形符 (~),不过相同原则也适用于每个运算符。
转义特殊字符
若要使用任何搜索运算符作为搜索文本的一部分,请在字符前加上一个反斜杠 (\) 来转义该字符。 例如,若要执行对 https:// 的通配符搜索(其中 :// 是查询字符串的一部分),需要指定 search=https\:\/\/*。 同样,转义的电话号码模式可能类似于 \+1 \(800\) 642\-7676。
需要转义的特殊字符包括下列项:
+ - & | ! ( ) { } [ ] ^ " ~ * ? : \ /
注意事项
尽管转义将标记保留在一起,但在编制索引期间,词法分析可能会将它们去除。例如,标准 Lucene 分析器会在连字符、空格和其他字符处断开单词。 如果需要在查询字符串中使用特殊字符,则可能需要使用会将它们保留在索引中的分析器。 一些选择包括Azure自然语言分析器,该分析器会保留连字符词,或者自定义分析器用于处理更复杂的模式。 有关详细信息,请参阅部分词语、模式和特殊字符。
对 URL 中的不安全及保留字符进行编码
请确保对 URL 中的所有不安全字符和保留字符进行编码。 例如,“#”是不安全字符,因为它是 URL 中的片段/定位标识符。 如果用于 URL,则该字符必须编码为 %23。
& 和 = 是保留字符的示例,因为它们分隔参数并在Azure AI 搜索中指定值。 请参阅 RFC1738:统一资源定位器 (URL) 以获取更多详细信息。
不安全字符为 " ` < > # % { } | \ ^ ~ [ ]。 保留字符为 ; / ? : @ = + &。
布尔运算符
可以在查询字符串中嵌入布尔运算符以提高匹配的精准率。 除了字符运算符之外,完整语法还支持文本运算符。 始终将文本布尔运算符 (AND、OR、NOT) 全部以大写字母指定。
| 文本运算符 | 字符 | 示例 | 使用情况 |
|---|---|---|---|
| 和 | + |
wifi AND luxury |
指定匹配项必须包含的字词。 在此示例中,查询引擎查找同时包含“wifi”和“luxury”的文档。 还可以在字词前面使用加号字符 (+),使其成为必需项。 例如,+wifi +luxury 规定两个术语必须出现在单个文档的某个字段中。 |
| 或者 | (无)1 | wifi OR luxury |
当找到任一字词时,就找到匹配项。 在此示例中,查询引擎返回包含任一 wifi 或 luxury 两者的文档上的匹配项。 使用 searchMode=any,OR 是默认的连词运算符,因此 wifi luxury 等效 wifi OR luxury于 。 使用 searchMode=all 时,请使用显式 OR 运算符来实现这种行为。 |
| 不是 |
!、- |
wifi -luxury |
返回不包含该字词的文档的匹配项。 例如:“wifi -luxury”搜索包含“wifi”字词但不包含“luxury”的文档。 |
1 OR 操作不支持 | 字符。
非 布尔运算符
重要
NOT 运算符(NOT、! 或 -)在完整语法和简单语法中的行为不同。
- 在简单语法中,带有否定的查询始终会自动添加通配符。 例如,查询
-luxury会自动扩展为-luxury *。 - 在完整语法中,带有否定的查询不能与通配符结合。 例如,不允许使用查询
-luxury *。 - 在完整语法中,不允许使用带有单个否定的查询。 例如,不允许使用查询
-luxury。 - 在完整语法中,否定的行为将如同它们始终通过 AND 添加到查询中,无论搜索模式如何。
- 例如,完整语法中的完整语法查询
wifi -luxury仅提取包含词wifi的文档,然后将否定-luxury应用于这些文档。
- 例如,完整语法中的完整语法查询
- 如果要使用否定来搜索索引中的所有文档,建议使用简单语法和
any搜索模式。 - 如果要使用否定来搜索索引中的文档子集,建议使用完整语法或简单语法和所有搜索模式。
| 查询类型 | 搜索模式 | 示例查询 | 行为 |
|---|---|---|---|
| 简单 | 任意 | wifi -luxury |
返回索引中的所有文档。 具有“wifi”一词的文档或缺少“luxury”一词的文档的排名高于其他文档。 该查询扩展为 wifi OR -luxury OR *。 |
| 简单 | 全部 | wifi -luxury |
仅返回索引中包含“wifi”一词且不包含“luxury”一词的文档。 该查询扩展为 wifi AND -luxury AND *。 |
| 完全 | 任意 | wifi -luxury |
仅返回索引中包含“wifi”一词的文档,然后从结果中删除包含“luxury”一词的文档。 |
| 完全 | 全部 | wifi -luxury |
仅返回索引中包含“wifi”一词的文档,然后从结果中删除包含“luxury”一词的文档。 |
字段化搜索
可以使用 fieldName:searchExpression 语法定义字段化搜索操作,其中的搜索表达式可以是单个词,也可以是一个短语,或者是括号中的更复杂的表达式,可以选择使用布尔运算符。 下面是部分示例:
genre:jazz NOT historyartists:("Miles Davis" "John Coltrane")
如果想要两个字符串评估为单个实体,请务必将多个字符串放置在引号内,正如这个在 artists 字段中搜索两个不同艺术家的情况一样。
fieldName:searchExpression 中指定的字段必须是 searchable 字段。 有关如何在字段定义中使用索引属性的详细信息,请参阅创建索引。
注意事项
使用字段化搜索表达式时,不需使用 searchFields 参数,因为每个字段化搜索表达式都有一个显式指定的字段名称。 但是,如果需要运行查询,则仍可使用 searchFields 参数,其中的某些部分局限于特定字段,其余部分可以应用到多个字段。 例如,查询 search=genre:jazz NOT history&searchFields=description 只将 jazz 匹配到 genre 字段,而它则会将 NOT history 与 description 字段匹配。 在 fieldName:searchExpression 中提供的字段名称始终优先于 searchFields 参数,这就是在此示例中我们不需在 genre 参数中包括 searchFields 的原因。
模糊搜索
模糊搜索查找字词中具有类似构造的匹配项,将一个字词最多扩展为符合距离条件(2 或更低)的 50 个字词。 有关详细信息,请参阅模糊搜索。
要进行模糊搜索,请在单个单词末尾使用波形符~符号,并附加一个可选参数,即 0 到 2 之间的数字(默认值为 2),该参数用于指定编辑距离。 例如,“blue~”或“blue~1”会返回“blue”、“blues”和“glue”。
模糊搜索只能应用于字词,不能应用于带引号的短语,但可以在多部分名称或短语中单独将波浪号追加到每个字词。 例如,“Unviersty~ of~ Wshington~”会匹配“University of Washington”。
邻近搜索
邻近搜索用于搜索文档中彼此邻近的术语。 在短语末尾插入波形符“~”,后跟创建邻近边界的字数。 例如,“"hotel airport"~5”在文档中查找彼此相距五个单词以内的字词“hotel”和“airport”。
术语提升
将搜索视为两个步骤。 首先,Azure AI 搜索查找匹配的文档。 然后,它会对这些匹配结果进行排序。 术语提升仅影响第二步:它可以将与查询中某一部分匹配的文档提升到结果中更靠前的位置。
术语提升不同于评分配置文件。 权重提升会优先考虑当前查询中的单词、短语或词组。 评分配置文件会根据索引中定义的规则,对字段或其他索引内容赋予更高的权重。
提升范围
在查询中要提高权重的部分后面紧接着写上插入符号(^)和一个正数。 例如,tax^2 可将包含 tax 的文档排在仅匹配未提升词项的文档之前。 默认提升值为 1。 还可以使用介于 0 和 1 之间的值,例如 0.2,为匹配的权重减少。
标点符号会告诉你每个指令影响哪些字词:
- 字段名称加上一个冒号(称为字段前缀)显示在单词、带引号的短语或括号组之前。 例如,
content:指示 Azure AI 搜索 在content字段中查找。 - 提升(例如
^2,在单词、带引号的短语或括号组之后出现)。 它会告知 Azure AI 搜索 在对匹配结果进行排序时应优先考虑哪些因素。
下表使用默认值 searchMode=any,其中单词之间的空格的工作方式类似 OR。
| 查询 | 可以匹配的内容 | 提升有利于什么 |
|---|---|---|
deferred tax^2 |
deferred、 tax或两者。 |
只有 tax 这个词。 |
"deferred tax"^2 |
完整短语,其中各单词彼此相邻,并按此顺序排列。 | 完整的短语。 |
(deferred OR tax)^2 |
deferred、 tax或两者。 |
括号内的所有内容作为一组。 |
使用 searchMode=all时,查询 deferred tax^2 需要两个单词才能匹配。 提升仍仅适用于 tax。 若要改为匹配两个单词中的任意一个,请写作 deferred OR tax^2。
如果要提升整个短语或组,请将光标放在结束引号或右括号之后。 括号不会创建短语。 当单词必须彼此相邻且按特定顺序时使用引号。
提升和字段范围
字段名称后跟一个冒号,可限制 Azure AI 搜索 在何处查找。 提升会改变 Azure AI 搜索 对匹配结果的排名方式。 可以在同一查询中使用两者。
| 查询 | 含义 |
|---|---|
content:deferred tax^2 |
字段前缀仅适用于 deferred. 单独的 tax^2 部分使用所选 searchFields字段;如果未 searchFields 指定,则使用所有可搜索字段。
tax 匹配项会获得额外的排名权重。 |
content:"deferred tax"^2 |
仅在 content 中查找完整短语,并为该短语匹配赋予额外的排序权重。 |
content:(deferred OR tax)^2 |
仅在 content 中查找任一词,并为分组匹配结果赋予额外的排名权重。 |
例如,如果 searchFields 设置为 title,则第一个查询会在 deferred 中查找 content,并在 tax 中查找 title。 其他查询中的引号和括号会将这两个词都保留在 content 中。
重要
冒号和插入点在相反的方向工作。 字段前缀 content: 适用于其后的查询部分。 提升值 ^2 适用于它前面的查询部分。 使用引号或括号使该部分包含多个单词。 有关详细信息,请参阅字段搜索和优先级(分组)。
分析器对加权查询的影响
对于普通单词、短语和词组,权重提升不会跳过文本分析。 在匹配之前,Azure AI 搜索仍使用每个字段的分析器处理查询文本。 因此,在使用不同分析器的字段中,相同的提升文本匹配结果可能不同。
具有字段前缀的短语或组使用该字段的分析器。 没有字段前缀的文本会对每个被搜索的字段使用其分析器。 例如,可将文本转换为小写的分析器能够使 "DEFERRED TAX"^2 与已编入索引的小写词项进行匹配。
其他查询表单(如通配符、正则表达式和模糊查询)使用不同的分析规则。 添加加速功能不会改变这些规则。 有关详细信息,请参阅 阶段 2:词法分析。
正则表达式搜索
正则表达式搜索根据在 Apache Lucene 下有效的模式找到匹配项,如 RegExp 类中所述。
在Azure AI 搜索中,正则表达式为:
- 用正斜杠
/括起来 - 仅限小写字符
例如,若要查找包含“motel”或“hotel”的文档,请指定 /[mh]otel/。 正则表达式搜索与单个词匹配。
某些工具和语言会在 Azure AI 搜索 所施加的 转义规则 之外,要求额外的转义字符。 对于 JSON,包含正斜杠的字符串使用向后斜杠进行转义:microsoft.com/azure/变为 search=/.*microsoft.com\/azure\/.*/,其中search=/.* <string-placeholder>.*/设置正则表达式,microsoft.com\/azure\/是带转义正斜杠的字符串。
正则表达式查询中的两个常见符号是 . 和 *。
. 匹配任何一个字符,* 匹配前一个字符零次或更多次。 例如,“/be./”匹配字词“bee”和“bet”,而“/be*/”会匹配“be”、“bee”和“beee”,但不会匹配“bet”。 总之,“.*”允许匹配任何字符系列,因此“/be.*/”会匹配任何以“be”开头的字词,例如“better”。
如果正则表达式中出现语法错误,请查看特殊字符的转义规则。 还可以尝试不同的客户端来确认问题是否是特定于工具的。
通配符搜索
可将通常可识别的语法用于多个 (*) 或单个 (?) 字符通配符搜索。 完整的 Lucene 语法支持前缀和中缀匹配。 使用正则表达式语法进行后缀匹配。
请注意,Lucene 查询分析器支持将这些符号与单个术语一起使用,但不能与短语一起使用。
| 词缀类型 | 描述和示例 |
|---|---|
| 前缀 | 术语片段出现在 * 或 ? 之前。 例如,search=alpha* 查询表达式返回“alphanumeric”或“alphabetical”。 简单和完整的语法结构都支持前缀匹配。 |
| 后缀 | 术语片段出现在 * 或 ? 之后,使用正斜杠来分隔构造。 例如,search=/.*numeric/ 返回 alphanumeric。 |
| 中置词 | 术语片段中包含 * 或 ?。 例如,search=non*al 返回“non-numerical”和“nonsensical”。 |
可以将运算符合并到一个表达式中。 例如,980?2* 匹配“98072-1222”和“98052-1234”,其中 ? 匹配单个(所需的)字符,而 * 匹配跟在后面的任意长度的字符。
后缀匹配需要使用带有正斜杠 / 的正则表达式分隔符。 通常,不能使用 * 或 ? 符号作为术语的第一个字符,而不使用 /。 同样重要的是要注意,在正则表达式查询之外使用时,* 的行为有所不同。 在正则表达式正斜杠 / 分隔符之外,* 是通配符,可匹配任何一系列字符,就像正则表达式中的 .* 一样。 例如,search=/non.*al/ 生成与 search=non*al 相同的结果集。
注意事项
通常,模式匹配很慢,因此你可能需要使用其他方法,例如边缘 n 元标记化,为搜索词中的字符序列创建标记。 使用 N 元语法词汇切分,索引将更大,但查询的执行速度可能更快,具体取决于模式构造和要编制索引的字符串的长度。 有关详细信息,请参阅部分字词搜索和包含特殊字符的模式。
分析器对通配符查询的影响
在查询分析期间,以前缀、后缀、通配符或正则表达式形式构建的查询将绕过词法分析,按原样传递到查询树。 仅当索引包含查询所指定的格式的字符串时,才会查找匹配项。 在大多数情况下,在索引期间需要使用可以保留字符串完整性的分析器,使部分字词和模式匹配能够成功。 有关详细信息,请参阅 Azure AI 搜索 查询中的部分术语搜索。
考虑这样一种情况:你可能希望搜索查询“terminal*”返回包含“terminate”、“termination”和“terminates”等字词的结果。
如果你要用 en.lucene(Lucene 英文版)分析器,它将对每个术语应用主动的词干提取。 例如,terminate、termination、terminates 都将在索引中被标记化为 termi 标记。 另一方面,根本不会分析使用通配符或模糊搜索的查询中的字词,因此不会有与“terminat*”查询匹配的结果。
另一方面,Microsoft 分析器(在本例中是 en.microsoft 分析器)更高级一些,使用词形还原而不是词干提取。 这意味着所有生成的标记都应该是有效的英语单词。 例如,“terminate”、“terminates”和“termination”在索引中几乎保持完整,对于严重依赖于通配符和模糊搜索的场景,这是更好的选择。
对通配符和正则表达式查询评分
Azure AI 搜索对文本查询使用基于频率的评分(TF-IDF)。 但是,对于术语范围可能很广的通配符和正则表达式查询,则忽略频率因子,以防止排名偏向于比较少见的术语匹配。 通配符和正则表达式搜索对所有匹配项进行相同的处理。
特殊字符
在某些情况下,可能需要搜索特殊字符,如“❤”表情符号或“€”符号。 在此类情况下,请确保所使用的分析器不会筛选掉这些字符。标准分析器会跳过许多特殊字符,将其从索引中排除。
标记化特殊字符的分析器包括空格分析器,该分析器将由空格分隔的任何字符序列视为标记(因此,“❤”字符串会被视为标记)。 另外,诸如 Microsoft 英语分析器(“en.microsoft”)之类的语言分析器会将“€”字符串视为标记。 可以测试分析器,看它为给定的查询生成什么标记。
使用 Unicode 字符时,请确保在查询 URL 中正确转义了符号(例如,对于“❤”,将使用转义序列 %E2%9D%A4+)。 某些 REST 客户端会自动执行此转换。
优先级(分组)
使用括号来控制查询的哪些部分一起求值。 例如,motel AND (wifi OR luxury)需要motel,并且括号中的术语中至少有一个:wifi或luxury。
将字段前缀置于括号组之前,以在一个字段中搜索整个组。 例如,hotelAmenities:(wifi OR pool) 仅在 wifi 字段中查找 pool 或 hotelAmenities。
括号控制 AND 和 OR 如何协同工作。 它们不要求单词彼此相邻出现,也不要求按特定顺序出现。 对该行为使用引号。 若要增强组,请将插入符放在闭括号后面,如 hotelAmenities:(wifi OR pool)^2 所示。 有关详细信息,请参阅 提升范围。
查询大小限制
Azure AI 搜索对查询的大小和组合施加限制,因为无限制的查询可能会破坏搜索服务的稳定性。 查询大小和组成(子句数量)有限制。 前缀搜索的长度,以及正则表达式搜索和通配符搜索的复杂性也存在限制。 如果应用程序以编程方式生成搜索查询,则建议将其设计为不会生成无限大小的查询。
有关查询限制的详细信息,请参阅 API 请求限制。
另请参阅
- 简单搜索的查询示例
- 完整 Lucene 搜索的查询示例
- 搜索文档
- 用于筛选器和排序的 OData 表达式语法
Azure AI 搜索中的简单查询语法