Azure搜索的文档设计

时间:2017-02-14 11:11:59

标签: c# azure azure-cosmosdb azure-search azure-search-.net-sdk

我发帖以查看是否有人有解决方案,或者可以提供一些有关建模某些数据的指导,以便在天蓝色搜索中使用。

问题域

我目前正在使用DocumentDB来建模我想要搜索的一些数据。我的文件,我将称之为"实体A"目前看起来像:

{
 _id,                          //key - Guid
 name,                         //searchable - String
 description,                  //searchable - String
 tags: [ "T1", "T2", ...]      //facet - Collection(String)
 locations: [
   {
      coordinate,              //filter - GeoLocation (lat & long)
      startDateTime,           //filter - DateTimeOffset
      endDateTime              //filter - DateTimeOffset
   },
   ...
  ]
 ...
},
...

关系: 标签0 ... n实体A&位置0 ... n实体A

展平实体A并为标签的名称,描述和方面设置简单的索引和查询很好,效果很好。

问题在于尝试向索引添加位置。有效地我想搜索(用自然语言)是: 对于给定的术语,找到与x开始日期和y结束日期重叠的坐标附近的所有实体

从我在网上找到的内容 - 展平位置只有在它们成为字符串时才会起作用。

https://blogs.msdn.microsoft.com/kaevans/2015/03/09/indexing-documentdb-with-azure-seach/ https://docs.microsoft.com/en-us/azure/search/search-howto-index-json-blobs

这似乎失去了能够执行地理距离和日期范围查询的能力。

当前的想法

将实体A文档拆分为两个集合

新的实体A文件:

   {
     _id,                          //key - Guid
     name,                         //searchable - String
     description,                  //searchable - String
     tags: [ "T1", "T2", ...]      //facet - Collection(String)
     ...
    },

和多个位置实体

{
  _id,
  documentId,                     //relates to Document._id
  coordinate,
  startDate,
  endDate
}

问题:

最好有两个索引 - 一个用于新实体A,一个用于位置,然后加入结果?

我认为这是多租户搜索 https://docs.microsoft.com/en-us/azure/search/search-modeling-multitenant-saas-applications

有没有人知道实现这个的例子?

赞成

  • 认为它会起作用

缺点

  • 每个查询需要两次搜索匹配,然后合并结果(这可能是也可能不是理想的)。

更好地完全"反转"实体A和位置实体,即

之类的东西
{
  _id,
  documentDBId,                     //relates to Document._id
  coordinate,
  startDate,
  endDate,
  name,
  description,
  tags: []
  ...
}

赞成

  • 非常扁平,所以应该很容易索引和查询
  • 一次搜索,没有合并

缺点

  • 对于名称,描述,标签等,它需要多次更新 如果这些改变了
  • 会为同一个"实体A"获得多个结果。 如果日期跨越多个开始日期和结束日期

还有其他选择吗?

谢谢,我很乐意澄清是否需要

1 个答案:

答案 0 :(得分:0)

我倾向于你的第二个完全扁平或倒置的选项

{
  _id,
  documentDBId,                     //relates to Document._id
  coordinate,
  startDate,
  endDate,
  name,
  description,
  tags: []
  ...
}

我的主要论点是分页。如果您有两个搜索,并且想要在页面上返回10个结果,那么您每次搜索会得到多少结果,更重要的是,您从哪里开始搜索第2页?

也存在对结果进行排名的问题,但这些问题比分页更容易管理。