天蓝色搜索-模型/查询复杂模型类型

时间:2018-09-21 12:49:10

标签: azure azure-search

我试图查找有关在Azure搜索上建模/查询复杂数据类型的最佳方法的示例。我只能在以下链接中找到两种建模方法:

https://docs.microsoft.com/en-us/azure/search/search-howto-complex-data-types

但是没有关于如何从JSON查询特定属性的示例。在此阶段,此功能似乎处于预览模式:

https://feedback.azure.com/forums/263029-azure-search/suggestions/6670910-modelling-complex-types-in-indexes

假设我有一个复杂的类型,我想将其存储到Azure搜索的一个字段中:

{
   "name": "Thiago",
   "email": "thiago@thiago.com",
   "subscription": {
      "plan": "A",
      "billType": "month", 
      "tags": ["azure", "mvp", "search"]
   }
}

假设我要过滤包含标签“ azure”的文档。或对于那些帐单类型为“ month”的人

1 个答案:

答案 0 :(得分:1)

使用该文章中提到的方法模拟复杂类型时,可以使用与“平面类型”相同的方式进行过滤。但是,这带来了一些限制。 用集合模拟复杂类型的局限性之一是,您无法轻松地对“子文档”执行过滤器。以本文中的示例为例,假设您有locationsIdlocationsDescription字段。如果执行这样的过滤器:

$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'

通常可以使用“复杂类型”功能后,就不需要此“拼合”。