全文索引重建的时候发生了什么?

  • nebula 版本:2.6.1
    我进行了一个操作:删除所有的全文索引,然后重新建立全文索引,然后rebuild,这时rebuild产生的job一直在running,最后失败。
    1、我想知道我重建全文索引的这个过程中发生了什么?
    2、假设我的job成功了,如果此时我的nebula数据发生了变动,我需要重新rebuild吗?
    3、全文索引中es的数据和nebula的数据是完全相同的吗?
    4、全文索引应该在创建space之后插入数据之前建还是在插入数据之后建再rebuild?
    5、我已经建立了全文索引,并且成功了,此时我删除了space重新创建space,重新写入数据,此时需要先把es中的数据删了吗?还是直接用原来的就行?

能否请社区的人来回答一下上述问题,全文索引的文档真的太少了,遇到很多问题。

1、我想知道我重建全文索引的这个过程中发生了什么?

TBD,我还没研究,我猜测是从负责同步 es 的 listener 里从 es 测清理掉索引信息再重新创建

2、假设我的job成功了,如果此时我的nebula数据发生了变动,我需要重新rebuild吗?

不需要,listener 会异步去更新,同步机制见 ref 2 文章的 4.2 数据同步逻辑

3、全文索引中es的数据和nebula的数据是完全相同的吗?

参考 ref 2 文章中 4.1章节

4、全文索引应该在创建space之后插入数据之前建还是在插入数据之后建再rebuild?

两者都可以,一旦 rebuild 之后,新增数据会自动被异步更新到 es。

5、我已经建立了全文索引,并且成功了,此时我删除了space重新创建space,重新写入数据,此时需要先把es中的数据删了吗?还是直接用原来的就行?

两个 space 是不同的数据,对于用于 全文搜索(同步es)的 raft listener 来说,旧的 space 被删掉了,对应的全文索引也被删掉了,会去异步做这个删除的。应该不需要在 es 中做删除的。

ref:

  1. 全文索引
  2. https://nebula-graph.com.cn/posts/how-fulltext-index-works



这个查询的结果里面有这条数据,请问这个是什么问题呢?

方便发一下原始文本吗?

原始文本是指什么?上述数据的文本格式?

是的。“耐甲氧西林金黄色葡萄球菌”这个是插入的完整的文本吗?

是的,是这个属性的完整文本

还有一些其他的数据,不包括肺炎,但是包括上述数据的一部分子串,也在搜索结果当中,如:耐甲氧西林金黄色葡萄球菌(MRSA)检测试剂盒(胶体金法)。当然不仅限于这个字串,还有其他的数据。

我去排查一下。稍晚一些回复你。

1 个赞

好的,我怀疑是es的索引建立存在一些问题,有劳排查了,谢谢。

我这边并没有复现你说的这个问题。建议你这边手动清空ES数据,然后rebuild一下全文索引试试看。

ES中的索引应该没有什么大问题。2.6中的原生索引确实有个bug,如果您写入过以“耐甲氧西林金黄色葡萄球菌开头”,并包含“肺炎”字段的数据,确实有可能出现这种情况。

1 个赞

确实写入过,有这个数据,所以这个现在是有一个bug吗?
耐甲氧西林金黄色葡萄球菌肺炎,有一个类似这样的数据。

是的2.6里依旧存在这bug。但是我们在最新的代码修复了这个bug,并且为了修复这个bug,对原生索引的实现进行了重构,细节可以看这个PR https://github.com/vesoft-inc/nebula/pull/3196。

在2.6里面的话,如果想要规避这个bug,可以调大原生字符串索引的长度。

2 个赞