我试图查找有关在Azure搜索上建模/查询复杂数据类型的最佳方法的示例。我只能在以下链接中找到两种建模方法:
https://docs.microsoft.com/en-us/azure/search/search-howto-complex-data-types
但是没有关于如何从JSON查询特定属性的示例。在此阶段,此功能似乎处于预览模式:
假设我有一个复杂的类型,我想将其存储到Azure搜索的一个字段中:
{
"name": "Thiago",
"email": "thiago@thiago.com",
"subscription": {
"plan": "A",
"billType": "month",
"tags": ["azure", "mvp", "search"]
}
}
假设我要过滤包含标签“ azure”的文档。或对于那些帐单类型为“ month”的人
答案 0 :(得分:1)
使用该文章中提到的方法模拟复杂类型时,可以使用与“平面类型”相同的方式进行过滤。但是,这带来了一些限制。
用集合模拟复杂类型的局限性之一是,您无法轻松地对“子文档”执行过滤器。以本文中的示例为例,假设您有locationsId
和locationsDescription
字段。如果执行这样的过滤器:
$filter=locationsId/any(id: id eq '4') and locationsDescription/any(d: d eq 'Home office')
您可能会得到比您想要的更多的结果。例如,您可能会得到文档{3}的描述为{3}的locationsId
或具有不同locationsId
的描述为locationsDescription
的4。这是因为上面的两个子句必须使用单独的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'
通常可以使用“复杂类型”功能后,就不需要此“拼合”。