Nebula Graph - 全文索引

Posted 小毕超

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nebula Graph - 全文索引相关的知识,希望对你有一定的参考价值。

一、Nebula Graph - 全文索引

Nebula Graph 的全文索引,需要依靠于 Elasticsearch ,并且还存在着较多的限制,比如:

  • 全文索引当前仅支持LOOKUP语句。
  • 定长字符串长度超过 256 字节,将无法创建全文索引。
  • 如果 Tag/Edge type 上存在全文索引,无法删除或修改 Tag/Edge type
  • 一个 Tag/Edge type 只能有一个全文索引。
  • 属性的类型必须为String。
  • 全文索引不支持多个 Tag/Edge type 的搜索。
  • 不支持排序全文搜索的返回结果,而是按照数据插入的顺序返回。
  • 全文索引不支持搜索属性值为NULL的属性。
  • 不支持修改 Elastic Search 中的索引,只能删除重建。
  • 不支持管道符。
  • WHERE子句只能用单个条件进行全文搜索。
  • 全文索引不会与图空间一起删除。
  • 确保同时启动了 Elasticsearch 集群和 Nebula Graph,否则可能导致 Elasticsearch 集群写入的数据不完整。
  • 在点或边的属性值中不要包含'\\,否则会导致 Elasticsearch 集群存储时报错。
  • 从写入 Nebula Graph,到写入 listener,再到写入 Elasticsearch 并创建索引可能需要一段时间。如果访问全文索引时返回未找到索引,可等待索引生效(但是,该等待时间未知,也无返回码检查)。
  • 使用 K8s 方式部署的 Nebula Graph 集群不支持全文索引。

了解上面的限制了就可以使用 Nebula Graph 的全文索引了,否则的话,可能就要自己操控 es 实现全文索引了。

在开始前,需要安装好 Nebula Graph 环境 和 Elasticsearch 环境,可以参考下面来那个我的博客:

Nebula Graph 集群搭建:https://blog.csdn.net/qq_43692950/article/details/124802962

Elasticsearch 7.X 集群搭建:https://blog.csdn.net/qq_43692950/article/details/122244793

二、创建全文索引模板

Elasticsearch 环境搭建好后,需要创建全文索引模板,向 es 服务器发送 POST 请求:

http://192.168.40.128:9200/_template/nebula_index_template

请求体内容:


 "template": "nebula*",
  "settings": 
    "index": 
      "number_of_shards": 3,
      "number_of_replicas": 1
    
  ,
  "mappings": 
    "properties" : 
            "tag_id" :  "type" : "long" ,
            "column_id" :  "type" : "text" ,
            "value" : "type" : "keyword"
        
  


进入 Nebula Graph 登录 Elasticsearch 客户端:

可以使用SIGN IN语句登录。必须使用 Elasticsearch 配置文件中的 IP 地址和端口才能正常连接,同时登录多个客户端,请在多个elastic_ip:port之间用英文逗号(,)分隔。

SIGN IN TEXT SERVICE (192.168.40.128:9200, HTTP);


查看文本搜索客户端:

SHOW TEXT SEARCH CLIENTS;


退出文本搜索客户端

SIGN OUT TEXT SERVICE;

三、部署 Raft listener

全文索引的数据是异步写入 Elasticsearch 的。流程是通过 Storage 服务的 Raft listener(简称 listener)这个单独部署的进程,从 Storage 服务读取数据,然后将它们写入 Elasticsearch 中。

下面需要准备一台或者多台额外的服务器,来部署 Raft listener。注意请保证 Nebula 各组件(Metad、Storaged、Graphd、listener)有相同的版本。

注意:只能为一个图空间“一次性添加所有的 listener 机器”。尝试向已经存在有 listener 的图空间再添加新 listener 会失败。因此,需在一个命令语句里完整地添加全部的 listener

listener 进程与 storaged 进程使用相同的二进制文件,但是二者配置文件不同,进程使用端口也不同,可以在所有需要部署 listener 的服务器上都安装 Nebula Graph,但是仅使用 Storage 服务。安装 Nebula Graph 的可以参考上面的两个链接。

下面可以在安装路径下的etc目录下找到 listener 的配置文件,文件名称必须为nebula-storaged-listener.conf

官方提供的模板地址:https://github.com/vesoft-inc/nebula/blob/master/conf/nebula-storaged-listener.conf.production


重命名:

mv nebula-storaged-listener.conf.production nebula-storaged-listener.conf

修改配置文件:

启动 listener:

./bin/nebula-storaged --flagfile /usr/local/nebula/etc/nebula-storaged-listener.conf

进入 Nebula Graph,添加 listener ,多个 listener 服务用逗号隔开 ,注意添加前需要选中一个 space

ADD LISTENER ELASTICSEARCH 192.168.40.171:9789;


查看 listener

SHOW LISTENER;


补充:删除图空间的所有 listener(谨慎操作)

注意:删除 listener 后,将不能重新添加 listener,因此也无法继续向 ES 集群同步,文本索引数据将不完整。如果确实需要,只能重新创建图空间。

REMOVE LISTENER ELASTICSEARCH;

四、全文搜索

进入上面添加 listener space 中。

创建测试 tag :

create tag team(team_name string, persion_num int);

添加测试数据:

insert vertex team(team_name, persion_num) values "team_1":("小明的团队", 42);
insert vertex team(team_name, persion_num) values "team_2":("小明的第二个团队", 42);
insert vertex team(team_name, persion_num) values "team_3":("小明的第三个团队", 42);
insert vertex team(team_name, persion_num) values "team_4":("小红的测试团队", 42);
insert vertex team(team_name, persion_num) values "team_5":("小红的开发团队", 42);

创建原生索引进行测试:

create tag index if not exists team_index on team(team_name(20));

重建索引:

rebuild tag index team_index;

使用原生索引查询

lookup on team where team.team_name == "小红的开发团队" yield id(vertex),properties(vertex);


下面创建全文索引:

注意:索引名称需要以 nebula 开头,原因就是上面创建 es 模板的时候就是指定的 以 nebula 开头。

create fulltext tag index nebula_team_full_index on team(team_name);


重建全文索引:

rebuild fulltext index;


查看全文索引:

show fulltext indexes;


使用全文索引:

PREFIX 前缀匹配

lookup on team where prefix(team.team_name, "小明") yield id(vertex),properties(vertex);


WILDCARD 通配符匹配

lookup on team where wildcard(team.team_name, "*测试*") yield id(vertex),properties(vertex);


REGEXP 正则匹配:

lookup on team where regexp(team.team_name, ".*开发.*") yield id(vertex),properties(vertex);


FUZZY 模糊查询:

fuzzy(schema_name.prop_name, fuzzy_string, fuzziness, operator, row_limit, timeout)

  • fuzziness:可选项。允许匹配的最大编辑距离。默认值为auto。查看其他可选值和更多信息,请参见 Elasticsearch 官方文档。
  • operator:可选项。解释文本的布尔逻辑。可选值为or(默认)和and。
lookup on team where fuzzy(team.team_name, "小明的开发团队",auto, or) yield id(vertex),properties(vertex);


扩展:补充:删除全文索引

drop fulltext index nebula_team_full_index ;

以上是关于Nebula Graph - 全文索引的主要内容,如果未能解决你的问题,请参考以下文章

Nebula Graph 特性讲解——RocksDB 统计信息的收集和展示

CentOS 编译安装 Nebula Graph 3.10

CentOS 编译安装 Nebula Graph 3.10

CentOS 编译安装 Nebula Graph 3.10

CentOS 编译安装 Nebula Graph 3.10

Nebula graph 源码 学习笔记