Solr Block Join Query Parser может обрабатывать такие операции.
Структура данных изменяется в сторону иерархической системы, а createdAtWeek
заменяется на validSince_i
и validUntil_i
.
/* 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
}
]
}
]
}
BlockJoin теперь можно использовать с фасеткой, если timeValidities не перекрывают друг друга, например:
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, которые имеютrating >= 0.3
с описанием, содержащим short
Выполнение следующего тоже отлично работает
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 отображается, так как ее рейтинг>> 0,3 после недели> =2 с описанием, содержащим longer
.
Необходимо подтвердить аспект производительности, но он выполняет свою работу и избегает дублирования.