我们正在使用Azure Cognitive Search .NET SDK,并尝试通过一个字符串字段$filter
,该字符串字段可以包含诸如&
之类的特殊搜索字符以及单引号。
针对带有特殊字符的厨房接收器的测试用例进行过滤时,我们得到的结果为零(我们排除了|,因为它是search.in
的分隔符):
{
"FirmName": "Crazy Charz Inc. ' + - && ! ( ) { } [ ] ^ \" ~ * ? : \\ /"
...
}
当我们用\
将asked about here和recommended here换成特殊字符,并用双引号''
将单引号引起来时(如显示的in this answer ,而不是在SDK文档中),我们得到的结果为零。
Filter in our SearchParameters object设置为:
search.in(FirmName, 'Crazy Charz Inc. '' \+ \- \&\& \! \( \) \{ \} \[ \] \^ \" \~ \* \? \: \\ \/', '|')
(这是在VS中检查变量时的外观;应该正确地对它进行转义。)
我们返回零结果。
我们已经确认它特定于特殊字符,因为我们有大量的测试,这些测试在相同的字段中匹配其他文档,而这些文档的值中不包含此类字符。
出于好奇,我们尝试像这样在Search Explorer中运行它:
$filter=search.in(FirmName, 'Crazy Charz Inc. '' \+ \- \&\& \! \( \) \{ \} \[ \] \^ \" \~ \* \? \: \\ \/', '|')
这样做时,我们会收到错误消息:
"Invalid expression: Found an unbalanced bracket expression.\r\nParameter name: $filter"
我们已经确认SDK会返回实际的零结果响应,而不是错误(我们在过滤器表达式中添加了实际的不平衡表达式以确认这一点。)
我们如何使用.NET SDK对具有特殊字符的值进行$filter
?这是一个错误,还是我们做错了什么?
注意:我们正在提供选项的选择列表并进行精确匹配;因此,针对此用例进行过滤,而不是进行搜索。稍后我们将在其他字段上添加搜索。
我们是否需要简单地对所有字段进行URLEncode? gh ...
答案 0 :(得分:2)
问题是您使用的编码方案语法与您想要的语法不同。
Azure认知搜索中有三种查询语法,每种都有自己的编码规则:
search
参数中使用;您链接到的文档中描述的编码规则)search
中,或多或少是Simple查询语法的超集)$filter
,$select
和$orderby
;已记录在here中)。单引号加倍的规则来自OData。您要应用的其他规则是针对简单查询语法的,而不是针对OData的。
我编写了一个小型控制台应用程序来对此进行测试,并且能够使用以下确切的字符串文字匹配预期的文档:
@"search.in(hotelName, 'Crazy Charz Inc. '' + - && ! ( ) { } [ ] ^ "" ~ * ? : \ /', '|')"
请注意,因为我使用的是逐字字符串,所以只需要转义引号(OData的单引号,编译器的双引号)。