【Cypher】FULLTEXT 索引(全文索引):文本数据进行全文检索、模糊匹配 和 复杂文本搜索

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 标签的 titledescription 属性的 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 逻辑运算符查询 MatrixRevolution 都匹配的结果。
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix OR Cloud') YIELD node, score
RETURN node.title, score
  • 使用 OR 运算符返回 MatrixCloud 相关的电影。

5.4 使用通配符进行模糊匹配
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matr*') YIELD node, score
RETURN node.title, score
  • Matr* 使用通配符 * 进行模糊匹配,匹配 MatrixMatriarch 等内容。

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 使用 EXPLAINPROFILE 查看查询计划
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 复杂查询:使用 ANDOR 逻辑
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix AND Revolution') YIELD node, score
RETURN node.title, score
  • 查询匹配 MatrixRevolution 两个关键字的电影。
CALL db.index.fulltext.queryNodes('movieTitleIndex', 'Matrix OR Cloud') YIELD node, score
RETURN node.title, score
  • 查询匹配 MatrixCloud 的电影。

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() 进行查询。
  • EXPLAINPROFILE 可以帮助验证查询是否使用了 FULLTEXT 索引,提高查询效率。
  • FULLTEXT 索引支持模糊匹配、短语匹配、布尔逻辑和通配符查询,适用于搜索文本内容的场景。

掌握 FULLTEXT 索引的使用方法,可以帮助你优化 Neo4j 中文本数据的查询性能,提高数据检索的准确性和速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彬彬侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值