From d2892c8a35d288849806bc9b9464e363d1478392 Mon Sep 17 00:00:00 2001 From: foesa <35463247+foesa-yang@users.noreply.github.com> Date: Thu, 2 Feb 2023 11:49:13 +0800 Subject: [PATCH] Update full text index (#2462) * Update full text index * update * Update README.md * Update 1.search-with-text-based-index.md * Update 3.deploy-listener.md * Update 1.search-with-text-based-index.md * modify * Update 1.search-with-text-based-index.md * Update 2.deploy-es.md * Update docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> * Update docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> --------- Co-authored-by: abby.huang <78209557+abby-cyber@users.noreply.github.com> --- .../14.native-index-statements/README.md | 12 +- .../1.search-with-text-based-index.md | 16 ++- .../17.ES-function.md | 106 ------------------ .../1.text-based-index-restrictions.md | 22 +--- .../6.deploy-text-based-index/2.deploy-es.md | 65 ++--------- .../3.deploy-listener.md | 8 -- mkdocs.yml | 1 - 7 files changed, 20 insertions(+), 210 deletions(-) delete mode 100644 docs-2.0/3.ngql-guide/6.functions-and-expressions/17.ES-function.md diff --git a/docs-2.0/3.ngql-guide/14.native-index-statements/README.md b/docs-2.0/3.ngql-guide/14.native-index-statements/README.md index da35f2d3ca5..8b77e0c654f 100644 --- a/docs-2.0/3.ngql-guide/14.native-index-statements/README.md +++ b/docs-2.0/3.ngql-guide/14.native-index-statements/README.md @@ -36,26 +36,16 @@ NebulaGraph 支持两种类型索引:原生索引和全文索引。 ## 全文索引 -全文索引是基于Elastic Search来实现的,用于对字符串属性进行前缀搜索、通配符搜索、正则表达式搜索和模糊搜索,有如下特点: +全文索引是基于 Elasticsearch 来实现的,用于对字符串属性进行前缀搜索、通配符搜索、正则表达式搜索和模糊搜索,有如下特点: - 只允许创建一个属性的索引。 -- 只能创建指定长度(不超过 256 字节)字符串的索引。 - - 不支持逻辑操作,例如`AND`、`OR`、`NOT`。 !!! Note 如果需要进行整个字符串的匹配,请使用原生索引。 -### 全文索引操作 - -在对全文索引执行任何操作之前,请确保已经部署全文索引。详情请参见[部署全文索引](../../4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md) 和[部署 listener](../../4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md)。 - -部署完成后,Elasticsearch 集群上会自动创建全文索引。不支持重建或修改全文索引。如果需要删除全文索引,请在 Elasticsearch 集群上手动删除。 - -使用全文索引请参见[使用全文索引查询](../15.full-text-index-statements/1.search-with-text-based-index.md)。 - ## 没有 NULL 值索引 不支持对值为 NULL 的属性创建索引。 diff --git a/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md b/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md index e3e9bf46517..d5120423162 100644 --- a/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md +++ b/docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md @@ -14,14 +14,14 @@ ## 自然语言全文搜索 -自然语言搜索将搜索的字符串解释为自然人类语言中的短语。搜索不区分大小写,且默认是对字符串的每个子字符串(以空格分隔)单独判断搜索。例如,有三个点属于标签`player`,标签`player`含有属性`name`,这三个点的`name`分别为`Kevin Durant`、`Tim Duncan`和`David Beckham`。现在已经建立好有关`player.name`的全文索引,在用全文索引前缀搜索语句`LOOKUP ON player WHERE PREFIX(player.name,"d");`查询时,这三个点都会被查询到。 +自然语言搜索将搜索的字符串解释为自然人类语言中的短语。搜索区分大小写,且默认是对字符串进行前缀匹配。例如,有三个点属于标签`player`,标签`player`含有属性`name`,这三个点的`name`分别为`Kevin Durant`、`Tim Duncan`和`David Beckham`。现在已经建立好有关`player.name`的全文索引,在用全文索引前缀搜索语句`LOOKUP ON player WHERE PREFIX(player.name,"D");`查询时,只有`David Beckham`会被查询到。 ## 语法 ### 创建全文索引 ```ngql -CREATE FULLTEXT {TAG | EDGE} INDEX ON { | } ([]); +CREATE FULLTEXT {TAG | EDGE} INDEX ON { | } ([]); ``` ### 显示全文索引 @@ -36,6 +36,10 @@ SHOW FULLTEXT INDEXES; REBUILD FULLTEXT INDEX; ``` +!!! caution + + 数据量大时,重建全文索引速度较慢,可以修改 Storage 服务的配置文件(`nebula-storaged.conf`)中`snapshot_send_files=false`。 + ### 删除全文索引 ```ngql @@ -94,13 +98,7 @@ nebula> SHOW LISTENER; //创建 Tag。 nebula> CREATE TAG IF NOT EXISTS player(name string, age int); -//创建原生索引。 -nebula> CREATE TAG INDEX IF NOT EXISTS name ON player(name(20)); - -//重建原生索引。 -nebula> REBUILD TAG INDEX; - -//创建全文索引,索引名称需要以 `nebula` 开头。 +//创建全文索引,索引名称需要以`nebula_`开头。 nebula> CREATE FULLTEXT TAG INDEX nebula_index_1 ON player(name); //重建全文索引。 diff --git a/docs-2.0/3.ngql-guide/6.functions-and-expressions/17.ES-function.md b/docs-2.0/3.ngql-guide/6.functions-and-expressions/17.ES-function.md deleted file mode 100644 index fee697a9e73..00000000000 --- a/docs-2.0/3.ngql-guide/6.functions-and-expressions/17.ES-function.md +++ /dev/null @@ -1,106 +0,0 @@ -# Elasticsearch 查询函数 - -Elasticsearch 查询函数可以让 NebulaGraph 向 Elasticsearch 发送 GET 请求读取数据,并将返回的 JSON 转换为 NebulaGraph 内的 map 格式,以便用于同一个复合图查询语句中。 - -关于 Elasticsearch 语法,请参见 [Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-your-data.html)。 - -!!! enterpriseonly - - 仅企业版支持本功能。 - -## 注意事项 - -- 不能使用已经部署了全文索引的 Elasticsearch 服务,需要使用独立部署的 Elasticsearch 服务,并且用户需要自行向 Elasticsearch 中写入数据,NebulaGraph 不会向该 Elasticsearch 写入数据。部署 Elasticsearch 集群请参见 [Kubernetes 安装 Elasticsearch](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-elasticsearch.html) 或[单机安装 Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.15/targz.html)。 - -- 使用前需要 SIGN IN 服务,例如`SIGN IN TEXT SERVICE (127.0.0.1:9200, HTTP)`,不再使用时可以 SIGN OUT 服务。具体语法请参见[登录文本搜索客户端](../../4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md#_3)。 - -- 只支持 GET 请求。请用 Elasticsearch 客户端执行 POST、PUT、DELETE 请求。 - -- 没有超时时间,NebulaGraph 会一直等待 Elasticsearch 返回结果。 - -- 不支持函数后直接跟操作符,例如`RETURN calles("/test/player/1")["_source"]`。 - -- 兼容 Elasticsearch 7 及以上版本,更低版本未测试。 - -## openCypher 兼容性 - -本文操作仅适用于 openCypher 方式。 - -## 语法 - -可以通过 calles() 直接执行 Elasticsearch 语句,也可以通过 callesfile() 执行指定文件内的 Elasticsearch 语句。 - -```ngql -calles(""); -callesfile(""); -``` - -- 返回类型:map。Elasticsearch 返回 JSON 格式字符串,NebulaGraph 转换成 map 格式。 - -## 示例 - -```ngql -nebula> RETURN calles("/test/player/1") AS a; -+---------------------------------------------------------------------------------------------------------------------------------------------+ -| a | -+---------------------------------------------------------------------------------------------------------------------------------------------+ -| {_id: "1", _index: "test", _primary_term: 1, _seq_no: 0, _source: {age: 43, name: "Tim Duncan"}, _type: "player", _version: 1, found: true} | -+---------------------------------------------------------------------------------------------------------------------------------------------+ - -nebula> WITH calles("/test/player/1") AS a RETURN a; -+---------------------------------------------------------------------------------------------------------------------------------------------+ -| a | -+---------------------------------------------------------------------------------------------------------------------------------------------+ -| {_id: "1", _index: "test", _primary_term: 1, _seq_no: 0, _source: {age: 43, name: "Tim Duncan"}, _type: "player", _version: 1, found: true} | -+---------------------------------------------------------------------------------------------------------------------------------------------+ - -nebula> WITH calles("/test/player/1") AS a \ - MATCH (b:player) WHERE b.player.age == a["_source"]["age"] \ - RETURN b; -+---------------------------------------------------+ -| b | -+---------------------------------------------------+ -| ("player141" :player{age: 43, name: "Ray Allen"}) | -+---------------------------------------------------+ - -//对于不存在的数据,会返回 found 字段为 false。 -nebula> WITH calles("/test/player/123") AS a RETURN a; -+-------------------------------------------------------------+ -| a | -+-------------------------------------------------------------+ -| {_id: "123", _index: "test", _type: "player", found: false} | -+-------------------------------------------------------------+ - -//对于不存在的文件,会返回报错 read Elaticsearch file fail。 -nebula> RETURN callesfile('/home/xxx/es_query_test.txt'); -+---------------------------------------------+ -| callESFile( "/home/xxx/es_query_test.txt" ) | -+---------------------------------------------+ -| {error: "read Elaticsearch file fail."} | -+---------------------------------------------+ - -nebula> RETURN callesfile('/home/xxx/es_query.txt'); -+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| callESFile( "/home/xxx/es_query.txt" ) | -+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| {_shards: {failed: 0, skipped: 0, successful: 1, total: 1}, hits: {hits: [{_id: "2", _index: "test", _score: 1.0, _source: {age: 36, name: "Tony Parker"}... | -+--------------------------------------------------------------------------------------------------------------------------------------------------------------+ - - -nebula> WITH callesfile('/home/xxx/es_query.txt') AS s RETURN [n in s["hits"]["hits"]|n.`_source`.name]; -+--------------------------------------------------------------------------------------------------------------------------------------+ -| [n IN s["hits"]["hits"] | n._source.name] | -+--------------------------------------------------------------------------------------------------------------------------------------+ -| ["LeBron James", "Danny Green", "Kevin Durant", "Stephen Curry", "Rudy Gay", "Ray Allen", "Tim Duncan", "Tony Parker", "Chris Paul"] | -+--------------------------------------------------------------------------------------------------------------------------------------+ - -nebula> WITH callesfile('/home/xxx/es_query.txt') AS s \ - MATCH p= (a:player)-[:serve]->() \ - WHERE id(a) in [n in s["hits"]["hits"]|n.`_source`.name] RETURN p; -+---------------------------------------------------------------------------------------------------------------------------------------------------+ -| p | -+---------------------------------------------------------------------------------------------------------------------------------------------------+ -| <("LeBron James" :player{age: 34, name: "LeBron James"})-[:serve@1 {end_year: 2018, start_year: 2014}]->("Cavaliers" :team{name: "Cavaliers"})> | -| <("LeBron James" :player{age: 34, name: "LeBron James"})-[:serve@0 {end_year: 2010, start_year: 2003}]->("Cavaliers" :team{name: "Cavaliers"})> | -... -``` diff --git a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/1.text-based-index-restrictions.md b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/1.text-based-index-restrictions.md index 13db0c8d9f1..db7d4c75299 100644 --- a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/1.text-based-index-restrictions.md +++ b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/1.text-based-index-restrictions.md @@ -4,21 +4,15 @@ 本文介绍全文索引的限制,请在使用全文索引前仔细阅读。 -全文索引有如下 16 条限制: +全文索引有如下 14 条限制: - 全文索引当前仅支持`LOOKUP`语句。 - -- 不支持全文索引的名称包含大写字母。 -- 定长字符串长度超过 256 字节,将无法创建全文索引。 - -- 全文索引依赖原生索引,必须先为 Tag/Edge type 创建原生索引。 +- 全文索引名称必须以`nebula_`开头,只能包含数字、小写字母、下划线,字符串长度不能超过 256 字节。 - 如果 Tag/Edge type 上存在全文索引,无法删除或修改 Tag/Edge type。 -- 一个 Tag/Edge type 只能有一个全文索引。 - -- 属性的类型必须为`String`。 +- 属性的类型必须为`STRING`或`FIXED_STRING`。 - 全文索引不支持多个 Tag/Edge type 的搜索。 @@ -26,24 +20,14 @@ - 全文索引不支持搜索属性值为`NULL`的属性。 -- 写入数据时,Elasticsearch 会自动创建相应的索引。在 NebulaGraph 中创建全文索引,但是未写入数据,查询时会报错`text search not found`。 - - 不支持修改 Elasticsearch 中的索引,只能删除重建。 - 不支持管道符。 - `WHERE`子句只能用单个条件进行全文搜索。 -- 全文索引不会与图空间一起删除。 - - 确保同时启动了 Elasticsearch 集群和 NebulaGraph,否则可能导致 Elasticsearch 集群写入的数据不完整。 -- 在点或边的属性值中不要包含`'`或 `\`,否则会导致 Elasticsearch 集群存储时报错。 - - 从写入 NebulaGraph,到写入 listener,再到写入 Elasticsearch 并创建索引可能需要一段时间。如果访问全文索引时返回未找到索引,可等待索引生效(但是,该等待时间未知,也无返回码检查)。 - 使用 K8s 方式部署的 NebulaGraph 集群不支持全文索引。 - -{{ ent.ent_begin }} -- 不能与 [calles()](../../3.ngql-guide/6.functions-and-expressions/17.ES-function.md) 函数同时使用。 -{{ ent.ent_end }} \ No newline at end of file diff --git a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md index 482ae39edc0..38f1d2027b6 100644 --- a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md +++ b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/2.deploy-es.md @@ -8,67 +8,16 @@ NebulaGraph 的全文索引是基于 [Elasticsearch](https://en.wikipedia.org/wi ## 部署 Elasticsearch 集群 -部署 Elasticsearch 集群请参见 [Kubernetes 安装 Elasticsearch](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-elasticsearch.html) 或[单机安装 Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.15/targz.html)。 - -当 Elasticsearch 集群启动时,请添加 NebulaGraph 全文索引的模板文件,以下面的模板为例: - -!!! note - - 以下模板对应 ES 7.8 版本。ES 的版本不同,索引模板可能也不同。打开 [Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/index-templates.html) 查看对应 ES 版本使用的索引模板。 - -```json -{ - "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"} - } - } -} -``` +部署 Elasticsearch 集群请参见 [Kubernetes 安装 Elasticsearch](https://www.elastic.co/guide/en/cloud-on-k8s/current/k8s-deploy-elasticsearch.html) 或[单机安装 Elasticsearch](https://www.elastic.co/guide/en/elasticsearch/reference/7.15/targz.html)。目前仅支持 7.x 版本的 Elasticsearch。 -请确保指定的以下字段严格符合上述模板格式: +!!! compatibility -```json -"template": "nebula*" -"tag_id" : { "type" : "long" }, -"column_id" : { "type" : "text" }, -"value" :{ "type" : "keyword"} -``` + NebulaGraph 3.4 及以后,不需要额外创建模板。 !!! caution - 创建全文索引时,索引名称需要以`nebula`开头。 - -示例命令: - -```bash -curl -H "Content-Type: application/json; charset=utf-8" -XPUT http://127.0.0.1:9200/_template/nebula_index_template -d ' -{ - "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_`开头。 + 用户可以配置 Elasticsearch 来满足业务需求,如果需要定制 Elasticsearch,请参见 [Elasticsearch 官方文档](https://www.elastic.co/guide/en/elasticsearch/reference/current/settings.html)。 @@ -92,6 +41,10 @@ nebula> SIGN IN TEXT SERVICE (127.0.0.1:9200, HTTP); Elasticsearch 默认没有用户名和密码,如果设置了用户名和密码,请在`SIGN IN`语句中指定。 +!!! caution + + Elasticsearch 客户端只能登录一次,如有修改,需要`SIGN OUT`后重新`SIGN IN`,且客户端对全局生效,多个图空间共享相同的 Elasticsearch 客户端。 + ## 显示文本搜索客户端 `SHOW TEXT SEARCH CLIENTS`语句可以列出文本搜索客户端。 diff --git a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md index 929f56fd5da..a8346f4016a 100644 --- a/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md +++ b/docs-2.0/4.deployment-and-installation/6.deploy-text-based-index/3.deploy-listener.md @@ -104,11 +104,3 @@ nebula> SHOW LISTENER; ```ngql nebula> REMOVE LISTENER ELASTICSEARCH; ``` - -!!! danger - - 删除 listener 后,将不能重新添加 listener,因此也无法继续向 ES 集群同步,文本索引数据将不完整。如果确实需要,只能重新创建图空间。 - -## 下一步 - -部署[全文索引](2.deploy-es.md)和 listener 后,全文索引会在 Elasticsearch 集群中自动创建,用户可以开始进行全文搜索。详情请参见[全文搜索](../../3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md)。 diff --git a/mkdocs.yml b/mkdocs.yml index 2031e6efab4..b4783bf6d04 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -339,7 +339,6 @@ nav: - 谓词函数: 3.ngql-guide/6.functions-and-expressions/8.predicate.md - geo 函数: 3.ngql-guide/6.functions-and-expressions/14.geo.md #ent - - Elasticsearch 查询函数: 3.ngql-guide/6.functions-and-expressions/17.ES-function.md - 自定义函数: 3.ngql-guide/6.functions-and-expressions/9.user-defined-functions.md - 通用查询语句: