全部使用 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')
但是,这实际上并不等同于将 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 }
]
}
]
}
请注意,此功能在撰写本文时处于预览状态,但很快就会普遍可用(并公开记录)。
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')
但是,这实际上并不等同于将 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 }
]
}
]
}
请注意,此功能在撰写本文时处于预览状态,但很快就会普遍可用(并公开记录)。