全文索引命名规则
全文索引由用户命名,规则如下:
- 2~64个字符
- 以字母开头
- 仅允许使用字母,下划线和数字(_ 、A-Z、a-z、0-9)
一个图集中的全文索引不能重名。
查看全文索引
返回的表名:_nodeFulltext
、_edgeFulltext
返回的表头:name
| properties
| schema
| status
(全文索引名称、参照属性、所属schema、状态)
全文索引状态有creating(创建中)和done(已创建)。
// 查看当前图集中的所有全文索引(结果分点、边两个表返回)
show().fulltext()
// 查看当前图集中的所有全文点索引
show().node_fulltext()
// 查看当前图集中的所有全文边索引
show().edge_fulltext()
创建全文索引
仅支持对string或text类型的属性创建全文索引。
// 在当前图集中为指定点schema的指定属性创建全文索引
create().node_fulltext(@<schema>.<property>,"<name>")
// 在当前图集中为指定边schema的指定属性创建全文索引
create().edge_fulltext(@<schema>.<property>,"<name>")
本例@product的description属性创建全文索引并命名为prodDesc:
create().node_fulltext(@product.description, "prodDesc")
删除全文索引
删除一个属性时,其全文索引也会同时被删除。
// 从当前图集中删除指定点属性的全文索引
drop().node_fulltext("<name>")
// 从当前图集中删除指定边属性的全文索引
drop().edge_fulltext("<name>")
本例删除名为prodDesc的全文索引
drop().node_fulltext("prodDesc")
使用全文索引
嬴图的全文搜索引擎能实现高速的全文搜索,是嬴图过滤器的应用场景之一。全文过滤使用条件操作符contains
来判断一个全文索引的内容(分词结果)是否包含所有给定的关键词,判断标准有两种:
- 精确匹配
- 要求分词与关键词完全相等
- 可能会因分词库中不含关键词而导致无结果
- 模糊匹配
- 要求分词以关键词为开头
- 能最大程度地匹配到可能包含关键词的点、边,但返回时间比精确匹配长
除非有明确的精确匹配的诉求,建议尽可能使用模糊匹配。
语法
{~<fulltext> contains "<keyword_1> <keyword_2> ..."}
关于关键词<keyword_N>
:
- 多个关键词用空格隔开
- 关键词含英文双引号时,需要在引号前加反斜杠
\
- 用于模糊匹配的关键词以星号
*
结尾 - 关键词大小写不敏感
- 多个关键词的顺序不影响最终结果
点、边查询
本例通过全文索引prodDesc查找含有“保本”和“高收益”的点:
find().nodes({~prodDesc contains "保本 高收益"}) return nodes
本例通过全文索引prodDesc查找含有“保本”或“高收益”的点:
find().nodes({~prodDesc contains "保本" || ~prodDesc contains "高收益"}) return nodes
本例通过全文索引prodDesc查找含有“graph”和以“ult”开头的词的点:
find().nodes({~prodDesc contains "graph ult*"}) return nodes
模板查询
本例查询10条路径,通过全文索引companyName查找含有以“资本”开头的词的点作为起点,经过一条边到达含有以“投资”开头的词的点,再经过一条边到达含有以“人工智能”开头的词的点:
n({~companyName contains "资本*"}).e().n({~companyName contains "投资*"})
.e().n({~companyName contains "人工智能*"}) as paths
return paths{*} limit 10
本例查询10条路径,通过全文索引companyName查找含有以“红杉”开头的词的点作为起点,经过5条以内的边到达含有以“高瓴”开头的词的点:
n({~companyName contains "红杉*"}).e()[:5].n({~companyName contains "高瓴*"}) as paths
return paths{*} limit 10
在一张GP/LP或工商类的知识图谱中,上面的查询相当于把与“红杉”和“高瓴”有关的多家公司做一个深度的自组网。同样的操作无论是人工还是在三查的系统中,都需要大量的手动干预或批处理执行,无法做到像嬴图一样通过一个简单的嬴图GQL语句实时实现。