Cypher 中的 FULLTEXT 索引(Fulltext Index)详解
一、什么是 FULLTEXT 索引?
FULLTEXT 索引(全文索引) 是 Neo4j 提供的一种索引类型,专门用于对文本数据进行全文检索、模糊匹配 和 复杂文本搜索。
- FULLTEXT 索引允许对字符串属性执行高效的全文搜索,返回与查询关键字匹配的节点或关系。
- FULLTEXT 索引通过使用 Apache Lucene 提供的文本搜索引擎进行索引和查询,适用于处理大量文本数据。
二、FULLTEXT 索引的特点
2.1 支持的数据类型
String
类型的属性
2.2 支持的操作
- 全文搜索: 使用
db.index.fulltext.queryNodes()
或db.index.fulltext.queryRelationships()
进行全文检索。 - 模糊匹配: 支持部分匹配、短语匹配、通配符匹配和布尔查询。
- 高效检索: 适用于大规模文本数据的快速搜索。
2.3 适用场景
- 需要在文本数据中执行模糊搜索的场景,例如:
- 搜索电影标题、文章内容、产品描述等。
- 需要对关系属性进行全文检索的场景,例如:
- 查找评论、用户评价等文本内容。
三、创建 FULLTEXT 索引
3.1 基本语法
CREATE FULLTEXT INDEX index_name
FOR (n:Label) ON EACH [n.property1, n.property2, ...]
index_name
:索引的名称。n:Label
:指定节点或关系的标签。n.property1, n.property2
:指定需要创建 FULLTEXT 索引的一个或多个属性。
3.2 创建节点的 FULLTEXT 索引
CREATE FULLTEXT INDEX movieTitleIndex
FOR (m:Movie) ON EACH [m.title, m.description]
- 创建
Movie
标签的title
和description
属性的 FULLTEXT 索引,名称为movieTitleIndex
。
3.3 创建关系的 FULLTEXT 索引
CREATE FULLTEXT INDEX reviewIndex
FOR ()-[r:REVIEWED]-() ON EACH [r.comment]
- 创建
REVIEWED
关系的comment
属性的 FULLTEXT 索引,名称为reviewIndex
。
3.4 创建单个属性的 FULLTEXT 索引
CREATE FULLTEXT INDEX personNameIndex
FOR (n:Person) ON EACH [n.name]
- 创建
Person
标签name
属性的 FULLTEXT 索引。
四、查看和管理 FULLTEXT 索引
4.1 查看当前数据库中的所有索引
SHOW INDEXES
- 显示当前数据库中的所有索引,包括 BTREE、TEXT、POINT、RANGE 和 FULLTEXT 索引。
4.2 查看特定 FULLTEXT 索引的信息
SHOW INDEXES YIELD name, type, entityType, labelsOrTypes, properties
YIELD
关键字筛选并返回指定索引的详细信息。- FULLTEXT 索引的
type
字段会显示为FULLTEXT
。
4.3 删除 FULLTEXT 索引
DROP INDEX index_name
- 删除名称为
index_name
的 FULLTEXT 索引。
DROP INDEX movieTitleIndex
- 删除
movieTitleIndex
索引。
五、使用 FULLTEXT 索引进行查询
5.1 使用 db.index.fulltext.queryNodes()
查询节点
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix') YIELD node, score
RETURN node.title, score
- 使用
movieTitleIndex
进行全文检索,返回匹配Matrix
关键字的Movie
节点及匹配分数score
。
5.2 使用 db.index.fulltext.queryRelationships()
查询关系
CALL db.index.fulltext.queryRelationships('reviewIndex', 'amazing') YIELD relationship, score
RETURN relationship.comment, score
- 使用
reviewIndex
检索REVIEWED
关系中comment
属性中包含amazing
关键字的数据。
5.3 使用布尔运算符进行复杂查询
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix AND Revolution') YIELD node, score
RETURN node.title, score
- 使用
AND
逻辑运算符查询Matrix
和Revolution
都匹配的结果。
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix OR Cloud') YIELD node, score
RETURN node.title, score
- 使用
OR
运算符返回Matrix
或Cloud
相关的电影。
5.4 使用通配符进行模糊匹配
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matr*') YIELD node, score
RETURN node.title, score
Matr*
使用通配符*
进行模糊匹配,匹配Matrix
和Matriarch
等内容。
5.5 使用短语匹配进行精确搜索
CALL db.index.fulltext.queryNodes('movieTitleIndex', '"The Matrix"') YIELD node, score
RETURN node.title, score
- 使用短语匹配
"The Matrix"
进行精确检索。
5.6 限制返回结果数量
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix') YIELD node, score
RETURN node.title, score
ORDER BY score DESC
LIMIT 5
- 按匹配分数降序排序,并返回匹配度最高的
5
条记录。
六、FULLTEXT 索引的优化建议
6.1 为需要全文检索的属性创建 FULLTEXT 索引
- 如果某个属性经常在文本搜索中使用,应创建 FULLTEXT 索引以提高查询效率。
6.2 使用 EXPLAIN
和 PROFILE
查看查询计划
EXPLAIN CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix')
EXPLAIN
显示查询计划,确认是否使用了 FULLTEXT 索引。
PROFILE CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix')
PROFILE
执行查询并返回详细信息,包括查询过程中使用的索引。
6.3 使用 ORDER BY
提升查询性能
- 使用
ORDER BY score DESC
可以将匹配度最高的结果优先返回,提高查询性能。
6.4 避免 OR
查询造成索引失效
OR
逻辑查询可能导致索引失效,建议在FULLTEXT
查询中慎用。
6.5 使用 LIMIT
限制返回结果数量
- 限制结果数量有助于提升查询效率,避免一次性返回大量匹配结果。
七、FULLTEXT 索引的使用案例
7.1 全文检索电影标题
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix') YIELD node, score
RETURN node.title, score
- 返回匹配
Matrix
关键字的电影标题及匹配分数。
7.2 模糊匹配电影标题
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matr*') YIELD node, score
RETURN node.title, score
- 使用通配符
*
进行模糊匹配,返回以Matr
开头的电影。
7.3 短语匹配电影标题
CALL db.index.fulltext.queryNodes('movieTitleIndex', '"The Matrix"') YIELD node, score
RETURN node.title, score
- 精确匹配
The Matrix
关键字的电影。
7.4 复杂查询:使用 AND
和 OR
逻辑
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix AND Revolution') YIELD node, score
RETURN node.title, score
- 查询匹配
Matrix
和Revolution
两个关键字的电影。
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix OR Cloud') YIELD node, score
RETURN node.title, score
- 查询匹配
Matrix
或Cloud
的电影。
7.5 关系中的 FULLTEXT 索引匹配
CALL db.index.fulltext.queryRelationships('reviewIndex', 'amazing') YIELD relationship, score
RETURN relationship.comment, score
- 查询
REVIEWED
关系中包含amazing
关键字的评论。
八、删除 FULLTEXT 索引
8.1 删除特定 FULLTEXT 索引
DROP INDEX movieTitleIndex
- 删除
movieTitleIndex
索引。
8.2 删除所有 FULLTEXT 索引
SHOW INDEXES YIELD name
CALL {
WITH name
DROP INDEX name
}
- 删除数据库中所有 FULLTEXT 索引。
九、常见错误及注意事项
9.1 索引未生效
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix')
- 问题:FULLTEXT 索引未生效。
- 解决:使用
SHOW INDEXES
查看是否正确创建了 FULLTEXT 索引。
9.2 索引名称拼写错误
CALL db.index.fulltext.queryNodes('movieIndex', 'Matrix')
- 问题:索引名称拼写错误。
- 解决:使用
SHOW INDEXES
查看索引名称,确保索引名称正确。
9.3 删除不存在的索引
DROP INDEX movieIndex
- 错误:尝试删除不存在的索引时会报错,应先使用
SHOW INDEXES
检查索引名称。
十、总结
FULLTEXT 索引 适用于对大规模文本数据进行全文检索、模糊匹配和复杂文本查询。
- 通过
CREATE FULLTEXT INDEX
可以创建节点或关系上的 FULLTEXT 索引,并使用db.index.fulltext.queryNodes()
或db.index.fulltext.queryRelationships()
进行查询。 EXPLAIN
和PROFILE
可以帮助验证查询是否使用了 FULLTEXT 索引,提高查询效率。- FULLTEXT 索引支持模糊匹配、短语匹配、布尔逻辑和通配符查询,适用于搜索文本内容的场景。
掌握 FULLTEXT 索引的使用方法,可以帮助你优化 Neo4j 中文本数据的查询性能,提高数据检索的准确性和速度。