我想弄清楚我是如何完成以下操作的,到目前为止我找到的答案似乎都不合适:
我有一个相当静态和大量的资源,我需要索引和搜索。 Solr似乎非常适合。此外,我需要能够让我的用户将主数据集中的资源添加到“收藏夹”文件夹(其中可以包含更多标签)。收藏夹需要以与主数据集相同的方式在所有相同字段和其他字段中进行搜索。
我的第一个想法是有两个独立的模式 - 主数据集及其元数据的第一个 - “收藏夹”文件夹的第二个文件夹,其中复制了主要集合中的所有元数据,然后添加其他字段。
然后我认为这可能会浪费相当多的空间(用户数远远大于主要资源的数量)。
那么我认为我可以拥有主数据集及其元数据(Core0),与上面相同,resourceId作为唯一标识符。然后会有第二个(Core1)为Favorites文件夹,其唯一ID为resourceId,userId,grade,文件夹全部为concantenated。 resourceId也是一个单独的字段。此外,我将创建另一个模式/核心(Core3),其中包含来自其他两个的所有字段,并在其上定义了一个请求处理程序,用于搜索其他两个核心并通过此核心返回结果。
此第三个核心将对其进行搜索,其中结果将仅针对单个用户返回。例如,用户在其“收藏夹”文件夹中搜索具有Foo的所有项目。结果只是用户在主数据集元数据中的某个地方添加到Foo中的那些项目。我想Core3的结果处理程序会破坏搜索,搜索Core0中Foo的所有文档,跨Core1搜索userId和文件夹,然后匹配来自两者的resourceIds,并消除两者中没有的资源。或者使用userId和文件夹在Core1上运行搜索,然后获得该结果集,提取所有resourceIds并将AND附加到Core0的搜索查询中,如:AND(resourceId = 1232232312 OR resourceId = 838388383 OR resourceId = 8637626491)
这可以起作用吗?或者是否有一些更简单的机制是Solr解决2个核心中2个搜索的合并,并且只返回两个匹配的结果(不一定是唯一的)?
感谢。
答案 0 :(得分:0)
问题看起来像是具有资源ID作为外键的2个表的数据库连接。 如果我理解错误,请忽略该帖子。
首先,我可能会使用单个核心,使用字段userid(索引但未存储),每次新用户通过附加其用户ID(由分析器忽略的内容分隔)来重新索引文档时重新编制索引。 因此搜索变得更容易(userId:“kaka的id”将获取我最喜欢的所有内容) 我认为这需要做一些工作,如果能够喜欢文档的用户数量增加,那么userid字段会变得非常长。
所以在那种情况下,我将继续我的下一个与你的相似的想法,有一个第二个核心(userid,资源id)。写一个包装器,首先搜索这个核心所有的收藏夹,然后搜索另一个在where where条件下的所有资源的核心,但再次..如果用户喜欢更多资源,查询可能超过GET方法的大小限制..
如果两者似乎都不起作用,那么是时候考虑一些更具可扩展性的东西,这会让我们留下相同的空间浪费选项。
我错过了什么吗?