Followwing语句查找所有具有Facebook或Twitter的个人资料,并且可以正常工作:
$filter=SocialAccounts/any(x: search.in(x, 'Facebook,Twitter'))
但是我找不到任何样本来查找同时具有Facebook和Twitter的所有内容。我尝试过:
$filter=SocialAccounts/all(x: search.in(x, 'Facebook,Twitter'))
但这不是有效的查询。
答案 0 :(得分:1)
Azure搜索不支持您要查找的“所有”过滤器。使用search.in和'all'等效于使用OR,但是Azure搜索只能在'all'lambda的主体中处理AND(这等效于'any'lambda的主体中的OR)。>
您可以尝试以下解决方法:
$filter=tags/any(t: t eq 'Facebook') and tags/any(t: t eq 'Twitter')
但是,这实际上不等于将all
与search.in
一起使用。使用all
表示的查询是匹配的文档,其中每个社交帐户严格都是Facebook或Twitter。如果存在其他社交帐户,则该文档将不匹配。解决方法没有此属性。文档必须至少具有 Facebook和Twitter才能匹配,但不能唯一地匹配。这当然是一个有效的方案。只是与原来的问题与all
和search.in
一起使用。
无论您如何尝试重写查询,都将无法表达与all
查询相同的内容。由于Azure搜索将字符串和其他原始类型的集合存储在反向索引中的方式,因此这是一个限制。
请对用户语音进行投票,以帮助确定优先级: https://feedback.azure.com/forums/263029-azure-search/suggestions/37166749-efficient-way-to-express-a-true-all
可能的解决方法是使用新的“复杂类型”功能,该功能的确允许在lambda表达式内使用更具表现力的过滤器。例如,如果将标签建模为具有单个value
属性的对象,而不是字符串的集合,则应该能够执行以下过滤器:
$filter=tags/all(t: search.in(t/value, 'Facebook,Twitter'))
在REST API中,您可以这样定义tags
:
{
"name": "myindex",
"fields": [
...
{
"name": "tags",
"type": "Collection(Edm.ComplexType)",
"fields": [
{ "name": "value", "type": "Edm.String", "filterable": true }
]
}
]
}
请注意,此功能在撰写本文时处于预览状态,但很快将普遍可用(并公开记录)。