QueryType设为full时特殊字符转义失效的问题咨询
Azure Search full查询模式下特殊字符转义失效问题
当把queryType设为full时,搜索带特殊字符的术语出了问题:
用下面的查询参数:
{ "search": "https\:\/\/*", "queryType": "full", "highlight": "content" }
会返回错误:FieldNotSearchable: Illegal arguments in query request: https is not a searchable field.
这说明系统把https:当成了字段选择器,:根本没被转义成功。
但换成simple模式,用一模一样的search参数:
{ "search": "https\:\/\/*", "queryType": "simple", "highlight": "content" }
就能得到预期的空结果。
问题原因
这是JSON转义和Lucene语法转义的冲突导致的:
- 在JSON字符串里,
\:会被JSON先解析成普通的:,所以实际传给Azure Search的搜索内容是https://*,Lucene看到https:自然会把它当作字段限定符。 - 而
simple模式不遵循Lucene语法,特殊字符的处理逻辑不一样,JSON转义后的字符串能被正确当成普通文本处理。
解决办法
要在full模式下正确转义特殊字符,得做双重转义:
- JSON里要用
\\代表一个真正的\ - 要让Lucene识别到
:是转义后的普通字符,就得把JSON里的\:改成\\:
正确的查询参数应该写成这样:
{ "search": "https\\:\\/\\/*", "queryType": "full", "highlight": "content" }
这样JSON解析后,传给Lucene的内容就是https\:\/\/*,此时:会被当成普通字符,不会再被识别为字段选择器。
内容的提问来源于stack exchange,提问作者Giacomo Castellani
相关产品推荐
相关产品推荐

