首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >跨时间的多准则搜索

跨时间的多准则搜索
EN

Stack Overflow用户
提问于 2018-05-28 18:20:56
回答 1查看 33关注 0票数 0

我正在寻找一种优雅且可扩展的方式来搜索跨时间的一些实体的元数据信息。

让我们看一下实体A和实体B随时间变化的以下元数据

代码语言:javascript
运行
复制
[{
    "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中,但在查看文档时,似乎没有一种方法可以先按实体和日期对结果进行分组,然后在分组中进行搜索。

有没有其他方法可以在不实际复制的情况下获得与复制相同的结果?

EN

Stack Overflow用户

发布于 2018-05-29 00:59:22

Solr块连接查询解析器可以处理这种操作。

数据结构朝着分层系统改变,并用validSince_ivalidUntil_i替换createdAtWeek

代码语言:javascript
运行
复制
/* 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与分面结合使用:

代码语言:javascript
运行
复制
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

运行下面的代码也很好

代码语言:javascript
运行
复制
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

性能方面需要断言,但它完成了工作并避免了重复。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50564171

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档