Azure认知搜索-如何按包含特殊字符的字段进行筛选

时间:2020-02-04 22:43:00

标签: c# azure-cognitive-search azure-search-.net-sdk

我们正在使用Azure Cognitive Search .NET SDK,并尝试通过一个字符串字段$filter,该字符串字段可以包含诸如&之类的特殊搜索字符以及单引号。

针对带有特殊字符的厨房接收器的测试用例进行过滤时,我们得到的结果为零(我们排除了|,因为它是search.in的分隔符):

{
  "FirmName": "Crazy Charz Inc. ' + - && ! ( ) { } [ ] ^ \" ~ * ? : \\ /"
  ...
}

当我们用\asked about hererecommended 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 ...

1 个答案:

答案 0 :(得分:2)

问题是您使用的编码方案语法与您想要的语法不同。

Azure认知搜索中有三种查询语法,每种都有自己的编码规则:

  1. 简单的查询语法(在search参数中使用;您链接到的文档中描述的编码规则)
  2. 完整的Lucene查询语法(也用在search中,或多或少是Simple查询语法的超集)
  3. OData语法(用于$filter$select$orderby;已记录在here中)。

单引号加倍的规则来自OData。您要应用的其他规则是针对简单查询语法的,而不是针对OData的。

我编写了一个小型控制台应用程序来对此进行测试,并且能够使用以下确切的字符串文字匹配预期的文档:

@"search.in(hotelName, 'Crazy Charz Inc. '' + - && ! ( ) { } [ ] ^ "" ~ * ? : \ /', '|')"

请注意,因为我使用的是逐字字符串,所以只需要转义引号(OData的单引号,编译器的双引号)。