全部使用 search.in

Using search.in with all

Follwing 语句找到所有拥有 Facebook 或 twitter 的个人资料,这有效:

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

但我找不到任何示例来查找同时具有 Facebook 和 twitter 的所有内容。我试过了:

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

但这不是有效查询。

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 }
      ]
    }
  ]
}

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