首页 > 解决方案 > ACS:search.in 不支持 odata 过滤器语法中的特殊字符

问题描述

特殊字符不适用于 ACS 中的 search.in 运算符,例如这不会从 ACS 获取任何值 search.in(category, 'Books & reference')。我还尝试对特殊字符进行如下编码,但仍然没有运气。

search.in(category, 'Books%20%26%20reference')
search.in(category, 'Books %26 reference')
search.in(category, 'Books+%26+reference')
search.in(category, 'Books & reference')

它工作的唯一方法是使用eq运算符如下

category eq 'Books & reference'

但是根据 ACS 文档,seach.in 在有多个要过滤的属性值时性能更高,也更方便

search.in(category, 'Movies,Education,Tools')

比使用 eq 运算符更方便如下

category eq 'Books' OR category eq 'Education' OR category eq 'Tools'

标签: filterodataazure-cognitive-searchacsazure-search-.net-sdk

解决方案


请尝试更改:

search.in(category, 'Books & reference')

search.in(category, 'Books & reference', '|')

本质上,在第一个中,space被视为分隔符。在第二个中,您明确告诉使用 apipe (|)作为分隔符。

考虑到管道字符不在您的搜索值中的任何位置,因此会搜索您的类别字段,而在第一种情况下,会针对类别字段中的、和值Books & reference执行搜索。Book&reference

这就是documentation关于分隔符的说法(强调我的):

解析 valueList 参数时将每个字符视为分隔符的字符串。此参数的默认值为“,” ,这意味着它们之间的任何带有空格和/或逗号的值都将被分隔。如果您需要使用空格和逗号以外的分隔符,因为您的值包含这些字符,您可以指定备用分隔符,例如“|” 在这个参数中。


推荐阅读