概述
全文索引是索引的一种,适用于高效搜索string
或text
类型的属性,尤其适用于描述、评论或文章等长文本字段。
全文索引对文本进行分词,得到一系列词元(Token)。执行查询时,引擎将指定的关键词与这些词元进行匹配,而非匹配完整的原始文本,从而快速检索相关结果。全文索引支持精确和模糊匹配。
显示全文索引
获取当前图集的全文索引信息:
// 显示所有全文索引
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()
可以删除一个点或边的全文索引。删除全文索引不会影响存储在分片中的属性值。
有全文索引的属性无法被删除。删除属性需要先删除它的全文索引。
删除点的全文索引prodDesc
:
drop().node_fulltext("prodDesc")
删除边的全边索引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().edges({~review contains "graph ult*"}) as e
return e
获取路径
使用ab()
语句查找5步内的路径,在起点和终点都应用全文索引companyName
:
ab().src({~companyName contains "Sequoia*"}).dest({~companyName contains "Hillhouse*"}).depth(:5) as p
return p
注意:在路径模板和K邻模板查询中,全文索引仅能作用在第一个点模板上。
例如,UQL不支持以下查询:
n().e().n({~prodDesc contains "graph"}) as p
return p
该查询可修改为:
find().nodes({~prodDesc contains "graph"}) as dest
n().e().n({_id == dest._id}) as p
return p
以下查询同样不受支持:
n().e({~review contains "ult*"}).n() as p
return p
该查询可修改为:
find().edges({~review contains "ult*"}) as e
n().e({_uuid == e._uuid}).n() as p
return p