全部使用search.in

问题描述 投票:1回答:1

以下声明查找所有具有Facebook或Twitter的配置文件,这有效:

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

但是我找不到任何可以找到Facebook和Twitter的样本。我试过了:

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

但这不是有效的查询。

azure-search
1个回答
1
投票

Azure搜索不支持您正在寻找的“所有”过滤器类型。将search.in与'all'一起使用等同于使用OR,但Azure Search只能处理'all'lambda(在'any'slambda的主体中等效于OR)中的AND。

您可以尝试这样的解决方法:

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

请注意,此功能在撰写本文时已预览,但很快就会公布(并公开记录)。

© www.soinside.com 2019 - 2024. All rights reserved.