我发帖是想看看是否有人有解决方案,或者可以提供一些关于建模某些数据的指导,以便在天蓝色搜索中使用。
问题域
我目前正在使用 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-如何索引-json-blob
这似乎失去了执行地理距离和日期范围查询的能力。
当前的想法
将实体 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”的多个结果
或者
还有其他选择吗?
谢谢,如果需要,我很乐意澄清