我正在寻找一种优雅且可扩展的方式来搜索跨时间的一些实体的元数据信息。
让我们看一下实体A和实体B随时间变化的以下元数据
[{
"idEntity": "A",
"name": "Name of A",
"rating": 0.5,
"description": "Some short description of A",
"createdAtWeek": 1
}, {
"idEntity": "B",
"name": "Name of B",
"rating": 0.2,
"description": "Some short description of B",
"createdAtWeek": 1
}, {
"idEntity": "A",
"name": "Name of A improved",
"rating": 0.5,
"description": "Some longer description of A",
"createdAtWeek": 2
}, {
"idEntity": "A",
"name": "Name of A improved",
"rating": 0.6,
"description": "Some longer description of A",
"createdAtWeek": 3
}]我希望能够找到最后一个元匹配rating >= 0.2的实体(唯一的),并且在它们的description中包含单词of。我也希望能够在过去去寻找这些相同的标准,但这需要给我不同的结果。
通过Mongo实现这一点最简单的方法是创建一个聚合管道,但如果集合变得越来越大,这就太慢了。
因此,我复制了所有文档,以便每周(1-3)获得完整的数据,这使我可以直接将createdAtWeek包括在查询中,并确保在一段时间内获得一致的结果。
但你可以看到这导致了什么,巨大的重复使得收藏变得巨大而毫无意义。
因此,我尝试将这些文档存储在Solr中,但在查看文档时,似乎没有一种方法可以先按实体和日期对结果进行分组,然后在分组中进行搜索。
有没有其他方法可以在不实际复制的情况下获得与复制相同的结果?
发布于 2018-05-29 00:59:22
Solr块连接查询解析器可以处理这种操作。
数据结构朝着分层系统改变,并用validSince_i和validUntil_i替换createdAtWeek。
/* Entity A */
{
"path_s": "1.entity",
"id": "A",
"_childDocuments_": [
{
"path_s": "2.metadata.rating",
"id": "2.metadata.rating.1",
"_childDocuments_": [
{
"path_s": "3.metadata.rating.timeValidity",
"id": "2.metadata.rating.timeValidity.1",
"validSince_i": -1,
"validUntil_i": 2,
"value_f": 0.5
},
{
"path_s": "3.metadata.rating.timeValidity",
"id": "2.metadata.rating.timeValidity.2",
"validSince_i": 3,
"validUntil_i": 9999999,
"value_f": 0.6
}
]
},
{
"path_s": "2.metadata.description",
"id": "2.metadata.description.1",
"_childDocuments_": [
{
"path_s": "3.metadata.description.timeValidity",
"id": "2.metadata.description.timeValidity.1",
"validSince_i": -1,
"validUntil_i": 1,
"value_txt_en": "Some short description of A"
},
{
"path_s": "3.metadata.description.timeValidity",
"id": "2.metadata.description.timeValidity.2",
"validSince_i": 2,
"validUntil_i": 9999999,
"value_txt_en": "Some longer description of A"
}
]
}
]
}
/* Entity B */
{
"path_s": "1.entity",
"id": "B",
"_childDocuments_": [
{
"path_s": "2.metadata.rating",
"id": "2.metadata.rating.2",
"_childDocuments_": [
{
"path_s": "3.metadata.rating.timeValidity",
"id": "2.metadata.rating.timeValidity.3",
"validSince_i": -1,
"validUntil_i": 9999999,
"value_f": 0.2
}
]
}
]
}只要timeValidities不像下面这样相互重叠,就可以将BlockJoin与分面结合使用:
fq={!parent which="path_s:1.entity"}(path_s:3.metadata.rating.timeValidity AND validUntil_i:[2 TO *] AND value_f:[0.3 TO *])&fq={!parent which="path_s:1.entity"}(path_s:3.metadata.description.timeValidity AND validUntil_i:[2 TO *] AND value_txt_en:short)&q=*:*它不返回任何实体,因为没有比第2周晚的实体具有包含short的描述的rating >= 0.3
运行下面的代码也很好
fq={!parent which="path_s:1.entity"}(path_s:3.metadata.rating.timeValidity AND validUntil_i:[2 TO *] AND value_f:[0.3 TO *])&fq={!parent which="path_s:1.entity"}(path_s:3.metadata.description.timeValidity AND validUntil_i:[2 TO *] AND value_txt_en:longer)&q=*:*正如您所看到的,实体A在>= 2周之后显示为>= 0.3,其描述包含longer。
性能方面需要断言,但它完成了工作并避免了重复。
https://stackoverflow.com/questions/50564171
复制相似问题