我有以下用例。我有深层嵌套的对象(可以嵌套到大约4或5级)。 示例:
{
"siteId": "1h2112o8320",
"siteName": "Maricopa",
"type" : "site",
"_childDocuments_": [{
"areaId": "xjn2d2d2",
"type" : "area",
"areaName": "Some Area",
"areaSpecialty": "Awesomeness!",
"_childDocuments_": [{
"lineId": "idb283d22dcou",
"type" : "line"
"lineName": "Some Line",
"lineScore": 100
}]
}]
}
我是Apache Solr的新手,正在使用7.4。假设我为层次结构中单个文档的所有不同属性定义了一个copyField,是否可以在任何级别进行搜索并返回整个文档?
说我搜索“ Maricopa”或“ Some Area”,它仍然应该找到此文档并返回整个层次结构?使用SOlr的当前功能是否有可能?
我尝试了以下查询,但未选择任何字段“ fl”
查询:
(type:site OR type:area OR type:line) AND text:"Maricopa"
此查询有效,但仅返回匹配的文档,而不返回整个层次结构。
因此,为了返回整个层次结构,我添加了以下字段列表:
*,[child parentFilter=type:site]
这将返回整个层次结构(尽管所有子级都作为一个平面列表)
现在,如果以上查询的结果与父项(例如站点)匹配,我将获得层次结构。如果查询与孩子或孙子匹配,则会出现以下错误:
java.lang.IllegalStateException: Parent query must not match any docs besides parent filter. Combine them as must (+) and must-not (-) clauses to find a problem doc. docID=6
所以,我试图了解我要实现的用例是否完全可以使用深度嵌套的对象,还是应该只维护一个平面对象,在这种情况下,如果以后我必须满足“ 获取给定站点的所有行”,我必须进行大量后期处理以提取必填字段。 (由于我不想执行该后处理,因此我想到了一个深度嵌套的对象实现)
感谢任何想法/帮助。
答案 0 :(得分:2)
通常,使用平面对象进行搜索使一切变得容易,而对于多个用例则具有多个集合。这将取决于您要建立索引的数据量(即,如果您有非常大的数据集,则对该数据集进行几次索引可能需要比可用或可承受的资源更多的资源)。它还将允许您优化每个集合的结构以适合该组数据的用例。
您可能已经有一个生成这些文档的数据存储,而不是从Solr重建对象。在这种情况下,请从您的集合中返回一个ID,然后从该存储中获取实际的预先构建的对象。大多数数据集已经有一种基于id来获取结构化数据的方法,但是如果您从平面文件中提取数据,在这种情况下将无法正常工作。在这种情况下,您还可以将完整的序列化对象附加到文档中,从而允许通过对该字段的内容反序列化JSON来重新创建对象。
话虽这么说,我通常更喜欢Elasticsearch如何在Lucene上更轻松地处理(深度)嵌套对象,但是它们的方法有其自身的取舍。