概述
全文索引是索引的一种,用于高效搜索string
或text
类型属性,尤其适用于描述、评论或文章等大文本字段。
全文索引将文本分割成更小的片段,我们称之为标记。执行查询时,搜索引擎将指定的关键词与这些标记进行匹配,而非匹配完整的原始文本,从而快速检索相关结果。这种方法支持关键词匹配和部分匹配。
显示全文索引
获取当前图集的全文索引信息:
// 显示所有全文索引
show().fulltext()
// 显示所有全文点索引
show().node_fulltext()
// 显示所有全文边索引
show().edge_fulltext()
全文索引信息展示在表格_nodeFulltext
和_edgeFulltext
中。表中各字段提供了每个全文索引的基础信息:
字段 |
描述 |
---|---|
name |
全文索引名称 |
properties |
全文索引关联属性 |
schema |
全文索引所属schema |
status |
全文索引当前状态,包括DONE 和CREATING |
创建全文索引
使用语句create().node_fulltext()
或create().edge_fulltext()
可以创建一个全文点索引或全文边索引。请注意,每个属性只能有一个全文索引。全文索引的创建以作业形式执行,稍后可使用show().job(<id?>)
确认全文索引是否创建成功。
为提升查询性能,嬴图中的系统属性已完成优化,具有内建效率。不过这些属性不支持额外索引。
// 创建一个全文点索引
create().node_fulltext(@<schema>.<property>, "<fulltextName>")
// 创建一个全文边索引
create().edge_fulltext(@<schema>.<property>, "<fulltextName>")
方法 | 参数 | 描述 |
---|---|---|
node_fulltext() 或edge_fulltext() |
@<schema>.<property> |
指定string 或text 类型属性及其schema |
<fulltextName> |
全文索引名称。命名规范如下:
|
为点属性@product.description
创建全文索引prodDesc
:
create().node_fulltext(@product.description, "prodDesc")
为边属性@review.content
创建全文索引review
:
create().edge_fulltext(@review.content, "review")
删除全文索引
使用语句drop().node_fulltext()
或drop().edge_fulltext()
可以删除一个全文点索引或一个全文边索引。删除全文索引不会影响存储在分片中的真实属性值。不过删除属性会自动删除相关全文索引。
删除全文点索引proDesc
:
drop().node_fulltext("proDesc")
删除全文边索引review
:
drop().edge_fulltext("review")
使用全文索引
在过滤条件中使用全文索引,需遵循{~<fulltextName> contains "<keyword1> <keyword2> ..."}
语法:
- 波浪号
~
标识全文索引。 - 运算符
contains
检查全文索引中的分段标记是否包含所有指定关键词。 - 多个关键词需用空格隔开。关键词含双引号时,需在引号前加反斜杠
\
。
共有两种搜索模式:
- 精准搜索能将关键词与标记完全匹配。
- 模糊搜索应用在关键词以星号
*
结尾时,匹配以该关键词开头的标记。
使用全文索引prodDesc
查找含有graph和database两个关键词的点:
find().nodes({~prodDesc contains "graph database"}) as n
return n
使用全文索引prodDesc
查找含有graph或database的点:
find().nodes({~prodDesc contains "graph" || ~prodDesc contains "database"}) as n
return n
使用全文索引prodDesc
查找含有graph且以ult开头的点:
find().nodes({~prodDesc contains "graph ult*"}) as n
return n
使用全文索引companyName
查找5步内路径,其中起点以Sequoia开头,终点以Hillhouse开头:
ab().src({~companyName contains "Sequoia*"}).dest({~companyName contains "Hillhouse*"}).depth(:5) as p
return p
请注意,在路径模板和K邻模板查询中,全文索引仅作用在第一个点模板上。例如,UQL不支持以下查询:
n().e().n({~name contains "Good"}) as p
return p
您可将其修改为如下所示:
find.nodes({~name contains "Good"}) as dest
n().e().n({_id == dest._id}) as p
return p