Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update full text index #2462

Merged
merged 11 commits into from
Feb 2, 2023
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 @@ -340,7 +340,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