递归嵌套jsonb结构的全文索引

可以说我有这样一本书:

{ title: "Tis no book"
  chapter: 1,
  text: "Hello world this is a book chapter",
  subchapters: [
     {
     chapter: 1.1
     text: "Nested sub chapter"
     subchapters: [
       chapter: 1.1.1
       text: "Nested nested..."
       subchapters: [ ...etc...]
     },
     {
     chapter: 1.2
     text: "Nested sub chapter 2"
     subchapters: [ ...etc...]
     }
   ]
}

我可以使用postgres的9.4新jsonb /杜松子酒(或任何其他)来设置此递归嵌套数据结构的"text"字段上的全文索引,以便存储到数据库的图书馆可以通过文本搜索使用索引)?


我刚开始研究全文搜索和jsonb类型。 一旦你理解了索引如何在JSONB类型上工作,看起来这是可能的。 我发现这个博客系列非常有帮助。

https://bibhas.in/blog/postgresql-swag-part-2-indexing-json-data-type-and-full-text-search/

此外,Postgres上JSON类型的文档也包含一些很好的见解。 http://www.postgresql.org/docs/9.4/static/datatype-json.html


一种选择 - 可能是最好的 - 是创建一个递归函数(关于函数的官方文档),它将整个JSONB结构的text值合并为一个字符串(它返回)。 您可以对该函数的输出进行全文索引(请参阅@ thomas-wayne-shelton的答案),就好像它只是一个字符串一样。 只要您在WHERE条件中使用相同的函数,pgSQL就应该识别该索引。

我只是建立/测试了一个类似的“扁平”功能,所以我相信它可以完成。 不幸的是,我的情况非常不同,所以我怀疑代码会混淆而不是开导。 我可以说这个函数必须标记为IMMUTABLE来支持索引。

===

另一条看起来很有前途的路径(但我认为是死路一条)是一个递归的CTE。

使用递归CTE解开递归数据当然是可能的。 这里是官方文档,SO答案和博客例子 - 最后两个专门用于递归嵌套JSONB。

但是,我不相信你可以索引这个输出。 这是我(暂定)的理解,即使用递归CTE的查询很像一个视图。 这是一个运行时间优化。 我现在不再提供参考资料,但回想一下最近(截至2018年4月)的讨论,即索引视图还有很长的路要走(我甚至不确定某个视图的索引实际上是否适用于CTE)。


我不会回答这个问题。 相反,我会建议一种完全不同的方法。

你看过Lucene,https://lucene.apache.org/core/? 在数据库中实现全文搜索是糟糕的设计。 你应该使用一个单独的全文索引器,比如Lucene。 Lucene文档应该引用可用于在数据库中查找真实记录的数据库密钥。

通过使用Lucene,与通过使用数据库的全文搜索功能相比,您很可能会获得更好的性能。 此外,Lucene比您的数据库更容易扩展。

链接地址: http://www.djcxy.com/p/84263.html

上一篇: full text indexing of recursive nested jsonb structures

下一篇: Has anyone got angular 2.0 alpha working with Polymer Elements?