【问题标题】:Azure Cognitive Search - How to filter by fields containing special charactersAzure 认知搜索 - 如何按包含特殊字符的字段进行筛选
【发布时间】:2020-05-20 19:49:09
【问题描述】:

我们正在使用 Azure 认知搜索 .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 中检查变量时的样子;它应该被正确转义。)

我们得到零结果。

我们已经确认它是特定于特殊字符的,因为我们有大量测试使用相同的字段来匹配其他值中不包含此类字符的文档。

出于好奇,我们尝试像这样在搜索资源管理器中运行它:

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

当我们这样做时,我们会得到错误:

"Invalid expression: Found an unbalanced bracket expression.\r\nParameter name: $filter"

我们已经确认 SDK 返回的是实际的零结果响应,而不是错误(我们在过滤器表达式中放置了一个实际的不平衡表达式来确认这一点)。

我们如何使用 .NET SDK $filter 处理带有特殊字符的值?这是一个错误,还是我们做错了什么?

注意:我们提供了一个选择列表并进行完全匹配;因此过滤而不是搜索这个用例。我们稍后会在其他字段上添加搜索。

我们需要简单地对所有字段进行 URLEncode 吗?呃……

【问题讨论】:

  • 发布了一个 SDK 错误 here,因为似乎没有人有答案。
  • 抱歉回复延迟,感谢您在 GitHub 上提交问题。我已将其分配给自己,并将进行调查。

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


【解决方案1】:

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

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

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

关于双引号的规则来自OData。您应用的其他规则适用于简单查询语法,而不是 OData。

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

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

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

【讨论】:

  • 您好,我正在使用 SDK,VS 示例中的过滤参数(复杂类型)为“(ComponentTypeNameJSON/v0 eq 'Engine & Alcohol')”,这不会获取任何结果
  • 语法对我来说是正确的,所以这似乎不是编码问题。在我的脑海中,我建议您检查您尝试匹配的值在大小写和空格中是否相同,因为过滤器会查找完全匹配的内容。
猜你喜欢
  • 2022-01-09
  • 2021-05-11
  • 2021-03-06
  • 2020-12-14
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 2021-10-11
相关资源
最近更新 更多