如何构造Azure Search指定字段的通配符搜索查询?
问题根因
你使用$filter=Title eq 'Full Stack*'的写法不符合Azure Search的语法规则:$filter下的eq运算符执行的是精确字符串匹配,本身不支持通配符解析,该语句实际是在匹配Title字段完全等于Full Stack*(包含星号)的记录。你看到的前20条符合结果属于巧合,后续无关内容是未限定检索范围时,Azure Search默认触发全局全文检索返回的结果。
注意:如果需要完全限定检索范围仅为Title字段,可以额外添加
searchFields=Title参数,避免其他字段匹配到查询词返回无关结果。
正确的通配符/包含查询写法
有两种常用实现方案:
方案1:使用search参数(性能最优,推荐全文检索场景使用)
首先要指定queryType=full开启完整Lucene查询模式,同时限定检索字段为Title:
- 匹配Title中**包含完整短语「Full Stack」**的所有记录(无需通配符,短语查询性能更高):
search=Title:"Full Stack"&queryType=full&$count=true
- 匹配Title中以「Full Stack」开头的所有记录(前缀通配符):
search=Title:"Full Stack"*&queryType=full&$count=true
- 匹配Title中**任意位置包含「Full Stack」**的所有记录(正则通配符,适合模糊匹配场景):
search=Title:/.*Full Stack.*/&queryType=full&$count=true
方案2:使用search.ismatch函数(适合需要和其他过滤条件结合的场景)
如果需要把包含查询和其他数值过滤、分类过滤条件组合,可以把查询逻辑写在$filter中:
$filter=search.ismatch('Title:"Full Stack"', 'full')&$count=true
多条件OR查询语法
以匹配Title包含「Full Stack」或者「Backend Developer」为例:
- 写在
search参数中:
search=Title:"Full Stack" OR Title:"Backend Developer"&queryType=full&$count=true
- 写在
$filter中:
$filter=search.ismatch('Title:"Full Stack" OR Title:"Backend Developer"', 'full')&$count=true
如果需要同时加其他过滤条件,比如薪资大于15K,直接用and拼接即可:
$filter=search.ismatch('Title:"Full Stack" OR Title:"Backend Developer"', 'full') and Salary ge 15000&$count=true
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

