我正在尝试将HTML文档解析为嵌套的标签和内容集。它需要支持任意嵌套深度。对象(在 Python代码)如下:
{
"content": [
"some text about a thing, ",
{"content": "More text with additional set of tags ",
"tags": ["strong"]
}
],
"tags": ["p"]
}
ES似乎不喜欢这种结构,因为content
字段既是文本类型又是对象类型,因此会产生此错误; "reason": "mapper [content] of different type, current_type [text], merged_type [ObjectMapper]"
是否有人对如何索引这种类型的对象有任何想法,并且还允许同时搜索标签和内容?理想情况下,我也想搜索与给定对象的祖先关联的标签。我可以将其重新格式化为
{
"content": [
{"content": "some text about a thing, "},
{"content": "More text with a different set of tags ",
"tags": ["strong"]
}
],
"tags": ["p"]
}
但是搜索并不是很有效,因为我需要编写content.content:“搜索字符串”以获得结果,这在多层嵌套中会变得很困难。
答案 0 :(得分:1)
为什么不将祖先标签存储在单独的字段中?实现嵌套集也将解决您的问题。
编辑:根据要求提供一个嵌套集的示例
想象一个树形结构。该树中的每个节点都有一组属性,例如描述或其他属性。每个节点还拥有对其父节点的引用。除此之外,还有两个数字:使用深度搜索遍历时在树中的左和右位置:
A(parent:null, left:1, right:12, desc:“root node“)
B(parent:A, left:2, right:3, desc:“left child“)
C(parent:A, left:4, right:11, desc:“right child“)
D(parent:C, left:5, right:6, desc:“foo“)
E(parent:C, left:7, right:10, desc:“bar“)
F(parent:E, left:8, right:9, desc:“baz“)
现在轻松计算节点的所有先验者:
祖先(F为X)=搜索节点为N,其中N.left
对于节点F,您将获得[E,C,A]。按左值对它们进行排序,您将获得F祖先的正确顺序。
因此,现在您可以将此条件用于ES中的过滤器查询,并使用第二个查询来搜索过滤节点的属性。
此结构在查找子树时非常有效,但是在更改节点顺序/位置时会有缺点。
如果您需要进一步的说明,请添加评论。