我试图找到有关在 Azure 搜索上建模/查询复杂数据类型的最佳方法的示例。我只能找到以下链接中描述的两种建模方法:
https://learn.microsoft.com/en-us/azure/search/search-howto-complex-data-types
但没有有关如何从 JSON 查询特定属性的示例。看来此功能现阶段处于预览模式:
假设我有一种复杂类型,我想将其存储到 Azure 搜索上的一个字段中:
{
"name": "Thiago",
"email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="fa8e92939b9d95ba8e92939b9d95d4999597" rel="noreferrer noopener nofollow">[email protected]</a>",
"subscription": {
"plan": "A",
"billType": "month",
"tags": ["azure", "mvp", "search"]
}
}
假设我想过滤包含标签“azure”的文档。或者对于帐单类型为“月”的人
最佳答案
使用该文章中提到的方法模拟复杂类型时,您可以按照与“平面类型”相同的方式进行过滤。然而,这带来了一些限制。
使用集合模拟复杂类型的限制之一是您无法轻松地对“子文档”执行过滤器。以本文中的示例为例,假设您有 locationsId
和 locationsDescription
字段。如果您执行这样的过滤器:
$filter=locationsId/any(id: id eq '4') and locationsDescription/any(d: d eq 'Home office')
您可能会得到比您想要的更多的结果。例如,您可能会获得 locationsId
为 3 且描述为“家庭办公室”的文档,或 locationsId
为 4 且具有不同 locationsDescription
的文档>。这是因为上面的两个子句必须使用单独的 lambda 表达式,因此不会对同一逻辑“子文档”进行比较。本文提到的一种解决方法是将值的组合索引在一起。如果您有一个 locationsCombined
字段,您可以像这样过滤它(假设您使用 |
作为分隔符对值进行索引):
$filter=locationsCombined/any(c: c eq '4|Home office')
不过,这对于您在 lambda 中可以表达的内容仍然有一些限制。
幸运的是,我们正在研究native support for Complex Types ,所以很快就不需要这样的解决方法了。
编辑
为了解决您的具体示例,假设您在每篇文章的“扁平化”架构中对数据进行建模,您可以像这样过滤标签:
$filter=subscriptionTags/any(t: t eq 'azure')
您可以像这样过滤 billType
:
$filter=subscriptionBillType eq 'month'
一旦复杂类型功能普遍可用,这种“扁平化”就没有必要了。
关于azure 搜索 - 模型/查询复杂模型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52444169/