全部使用search.in

时间:2019-03-20 21:53:10

标签: azure-search

Followwing语句查找所有具有Facebook或Twitter的个人资料,并且可以正常工作:

$filter=SocialAccounts/any(x: search.in(x, 'Facebook,Twitter'))

但是我找不到任何样本来查找同时具有Facebook和Twitter的所有内容。我尝试过:

$filter=SocialAccounts/all(x: search.in(x, 'Facebook,Twitter'))

但这不是有效的查询。

1 个答案:

答案 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')

但是,这实际上不等于将allsearch.in一起使用。使用all表示的查询是匹配的文档,其中每个社交帐户严格都是Facebook或Twitter。如果存在其他社交帐户,则该文档将不匹配。解决方法没有此属性。文档必须至少具有 Facebook和Twitter才能匹配,但不能唯一地匹配。这当然是一个有效的方案。只是与原来的问题与allsearch.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 }
      ]
    }
  ]
}

请注意,此功能在撰写本文时处于预览状态,但很快将普遍可用(并公开记录)。