Skip to content

Commit

Permalink
Update full text index (#2462)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>

* Update docs-2.0/3.ngql-guide/15.full-text-index-statements/1.search-with-text-based-index.md

Co-authored-by: abby.huang <[email protected]>

---------

Co-authored-by: abby.huang <[email protected]>
  • Loading branch information
foesa-yang and abby-cyber authored Feb 2, 2023
1 parent c46ff26 commit d2892c8
Show file tree
Hide file tree
Showing 7 changed files with 20 additions and 210 deletions.
12 changes: 1 addition & 11 deletions docs-2.0/3.ngql-guide/14.native-index-statements/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 的属性创建索引。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 <index_name> ON {<tag_name> | <edge_name>} ([<prop_name_list>]);
CREATE FULLTEXT {TAG | EDGE} INDEX <index_name> ON {<tag_name> | <edge_name>} ([<prop_name>]);
```

### 显示全文索引
Expand All @@ -36,6 +36,10 @@ SHOW FULLTEXT INDEXES;
REBUILD FULLTEXT INDEX;
```

!!! caution

数据量大时,重建全文索引速度较慢,可以修改 Storage 服务的配置文件(`nebula-storaged.conf`)中`snapshot_send_files=false`。

### 删除全文索引

```ngql
Expand Down Expand Up @@ -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);
//重建全文索引。
Expand Down
106 changes: 0 additions & 106 deletions docs-2.0/3.ngql-guide/6.functions-and-expressions/17.ES-function.md

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,46 +4,30 @@

本文介绍全文索引的限制,请在使用全文索引前仔细阅读。

全文索引有如下 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 的搜索。

- 不支持排序全文搜索的返回结果,而是按照数据插入的顺序返回。

- 全文索引不支持搜索属性值为`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 }}
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand All @@ -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`语句可以列出文本搜索客户端。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
1 change: 0 additions & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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

- 通用查询语句:
Expand Down

0 comments on commit d2892c8

Please sign in to comment.