neo4j 全文检索 (学习汇总整理)

neo4j使用存储过程实现全文索引和查询,内部是基于lucene

 

一、举例

创建和配置全文索引 例如,对Label为Movie和Book的节点创建索引,索引的字段包括title和description。则采用如下cypher语句。

CALL db.index.fulltext.createNodeIndex
("titlesAndDescriptions",["Movie", "Book"],["title", "description"])
使用以上索引搜索 title 或者 description 中包含“matrix”的节点,调用如下cypher语句。
CALL db.index.fulltext.queryNodes
("titlesAndDescriptions", "matrix") YIELD node, score

RETURN node.title, node.description, score

 

解释: CALL 调用一个存储过程,  YIELD 存放得到的结果, 用于下面的处理, 比如

call db.labels() yield label
return count(label) as num

查询举例2:

call db.index.fulltext.queryNodes(
    'index_name',        // 这里索引名
    'Av'                 // lucene查询语句
) yield node

where node.address contains "12"   // where语句
return node 

order by node.address  // order skip limit
skip 0
limit 1

Lucene搜索语法, 详细参考 https://www.jianshu.com/p/d924405e8db8    https://www.cnblogs.com/xing901022/p/4974977.html

Query implementationPurposeExample
TermQuery单词匹配neo4j
PhraseQuery短语匹配"graph database"
RangeQuery范围匹配[A TO Z] {A TO Z}
WildcardQuery正则匹配g*p?, d??abase
PrefixQuery前缀匹配algo*
FuzzyQuery后缀匹配cipher~
BooleanQuery查询条件聚合graph AND "shortest path"

可以用Lucene的全文检索语法,例如,如果需要完全匹配,则加双引号

CALL db.index.fulltext.queryNodes("titlesAndDescriptions", "\"Full Metal Jacket\"") YIELD node, score
RETURN node.title, score 
可以使用逻辑操作符,例如AND OR
CALL db.index.fulltext.queryNodes("titlesAndDescriptions", 'full AND metal') YIELD node, score
RETURN node.title, score

可以对指定的属性进行查询

CALL db.index.fulltext.queryNodes("titlesAndDescriptions", 'description:"surreal adventure"') YIELD node, score
RETURN node.title, node.description, score

  

二、常用的几个存储过程: 

1、创建全文节点索引    db.index.fulltext.createNodeIndex    参数包括:

1. 全局唯一的索引名称(类型为string);
2. labels(类型为string list);
3. properties(类型为string list);
4. config(可选的,是个key和value都为string类型的map)。config可以指定要建立索引的Analyzer(通过analyzer属性),还可以指定是否采用最终一致性模式(通过eventually_consistent)。

 

2、创建全文关系索引    db.index.fulltext.createRelationshipIndex    参数包括:

1. 全局唯一的索引名称(类型为string);
2. relationship types(类型为string list);
3. properties(类型为string list);
4. config(可选的,是个key和value都为string类型的map)。config可以指定要建立索引的Analyzer(通过analyzer属性),还可以指定是否采用最终一致性模式(通过eventually_consistent)。

 

3、使用全文节点索引    db.index.fulltext.queryNodes    参数:

1. 索引名称
2. lucene查询语句
   返回:
3. 匹配到的节点
4. lucene得分按照score降序返回

 

4、使用全文关系索引    db.index.fulltext.queryRelationships    参数:


1. 索引名称
2. lucene查询语句
   返回:
3. 匹配到的关系
4. lucene得分按照score降序返回

5、删除索引    db.index.fulltext.drop    参数:索引名称

6、最终一致性索引    db.index.fulltext.awaitEventuallyConsistentIndexRefresh    等待最新提交的事务在最终一致性全文索引中生效。

7、列出可用的Analyzer    db.index.fulltext.listAvailableAnalyzers    列出全文索引可用的所有Analyzer。lucene中已经内置了多种语言的analyzer。 

 

三、优点

Neo4j从2.2.x时代开始就默认开启node_auto_indexing=true. 倒排索引在数据插入时候已经创建了. 创建索引/删除索引代价是非常小的

官方文档:https://neo4j.com/docs/cypher-manual/3.5/schema/index/

  • 支持关系与节点的索引,为node和relationship的属性建立索引

  • 支持常用analyzers扩展 ,支持自定义Analyzer

  • 可以使用lucene query语句

  • 可以返回查询结果评分

  • 能够随着节点和关系的添加、移除、修改进行自动的更新

  • 自动检查一致性,如果有不一致的问题自动重建;

  • 创建、删除、更新都是事务的,能够在集群中自动进行副本;

  • 单索引文档数量不限

  • 能够通过cypher语句访问.

  • 能够配置为满足最终一致性。即,索引更新在提交路径中被移除,转为后台线程。利用此特性,对于性能要求高的场景,能够消除主要的写瓶颈。

相比于Neo4j内嵌的索引,采用Lucene索引具有如下优势:

1、neo4j的内嵌索引采用b树,其仅能够对STARTS WITH、ENDS WITH、完全相等三种条件起作用。而lucene建立的全文索引能够对任意片段的字符串进行查询。

2、lucene索引能够对多个label建立.

3、lucene索引能够对一到多个关系建立.

4、能够同时应用于多个属性。与内嵌索引的Composite Index不同。Composite Index仅对满足label且同时具有所有属性的实体起作用,而全文索引则对至少满足一个label、关系类型、属性的节点或关系起作用.

 

四、使用中文分词器:

自带的分词器,其中有一个是“cjk”是针对中国,日本,韩国做的分词器,支持中文分词的,可以这样建索引:

在可选参数config配置使用的分词器:

CALL db.index.fulltext.createNodeIndex("companyFullIndex",["CompanyEntry"],["name"], { analyzer: "cjk"})

 

使用IK分词器:

 

 

五、与Elasticsearch结合使用

 

 

 

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Python中实现对neo4j全文检索,可以使用py2neo库。这个库提供了一个方便的API来连接到neo4j数据库,并使用Cypher查询语言进行查询。 以下是一个简单的示例,演示如何在neo4j中执行全文检索: ```python from py2neo import Graph # 连接到neo4j数据库 graph = Graph("bolt://localhost:7687", auth=("neo4j", "password")) # 执行全文检索查询 query = "MATCH (n) WHERE n.name =~ '.*search_term.*' RETURN n" results = graph.run(query) # 打印结果 for result in results: print(result) ``` 在上面的示例中,我们首先使用`Graph`类连接到neo4j数据库。然后,我们使用Cypher查询语言执行一个全文检索查询,其中我们使用正则表达式来匹配包含特定搜索术语的节点。最后,我们打印结果。 请注意,上面的示例假定neo4j数据库已经设置并包含节点,其中包含要搜索的文本。如果您需要在Python中插入文本数据,请使用py2neo的`Node`和`Relationship`类,如下所示: ```python from py2neo import Graph, Node, Relationship # 连接到neo4j数据库 graph = Graph("bolt://localhost:7687", auth=("neo4j", "password")) # 创建一个节点 node = Node("Document", name="My Document", text="This is some text to search") # 将节点添加到数据库中 graph.create(node) # 执行全文检索查询 query = "MATCH (n) WHERE n.text =~ '.*search_term.*' RETURN n" results = graph.run(query) # 打印结果 for result in results: print(result) ``` 在上面的示例中,我们创建了一个名为“ My Document”的新节点,并将其添加到neo4j数据库中。我们使用`text`属性存储我们要搜索的文本。然后,我们执行一个全文检索查询,就像之前一样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值