NEO4J中文分词全文索引自动更新解决方案

2024-02-25 06:38

本文主要是介绍NEO4J中文分词全文索引自动更新解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

NEO4J中文分词全文索引自动更新解决方案

  • 一、样例数据
  • 二、英文与中文全文索引差别
    • 1、创建NEO4J默认索引
    • 2、删除索引
    • 3、创建支持中文分词的索引
  • 三、APOC自带英文全文索引过程(可自动更新索引)
    • 1、添加全文索引
    • 2、新增节点与属性
    • 3、检索
  • 四、自定义中文分词全文索引插件(自动更新索引不成功)
    • 1、添加全文索引
    • 2、新增节点与属性
    • 3、检索
  • 五、标签交叉检索
  • 六、自定义中文分词插件(自动更新索引失败单独更新节点索引)
    • 1、添加全文索引
    • 2、新增节点与属性并更新全文索引
    • 3、将2新增的节点或者更新的属性增加到索引
    • 4、检索
  • 七、解决事务提交超时
  • 八、备注

使用NEO4J INDEX API实现自动更新失败,转换了一种思路解决这个问题(在更新节点或者新建节点的时候同步更新到对应的全文索引中。)

一、样例数据

样例数据格式参考
在这里插入图片描述

二、英文与中文全文索引差别

1、创建NEO4J默认索引

CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]})
// 以下检索不成功:
CALL apoc.index.search('Loc', 'Loc.description:中文~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:中文*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:测试~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:测试中文~') YIELD node RETURN node

2、删除索引

CALL apoc.index.remove('Loc')

3、创建支持中文分词的索引

CALL zdr.index.addChineseFulltextIndex('Loc', ["description","cause","year"], 'Loc') YIELD message RETURN message
// 以下检索成功:
CALL apoc.index.search('Loc', 'description:中文~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:中文*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:测试~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'description:测试中文~') YIELD node RETURN node

三、APOC自带英文全文索引过程(可自动更新索引)

1、添加全文索引

CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]},{autoUpdate:true})

2、新增节点与属性

CREATE (n:Loc {name:'V'})  SET n.description='测试中文分词,复联终章快上映了好激动,据说知识图谱与人工智能技术应用到了那部电影!',n.cause='测试英文分词,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n

3、检索

可以支持索引的自动更新,但是对于中文的检索不友好,例如以下测试:

// 检索失败:
CALL apoc.index.search('Loc', 'Loc.cause:测试英文分词~') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:测试中文分词~') YIELD node RETURN node
// 检索成功:
CALL apoc.index.search('Loc', 'Loc.cause:测试英文分词*') YIELD node RETURN node
CALL apoc.index.search('Loc', 'Loc.description:测试中文分词*') YIELD node RETURN node

四、自定义中文分词全文索引插件(自动更新索引不成功)

addChineseFulltextAutoIndex过程为添加支持中文的全文索引过程,创建全文索引可以成功,但是对于节点的新增属性的更新,不支持自动更新。

1、添加全文索引

CALL zdr.index.addChineseFulltextAutoIndex('IKAnalyzer',["description","cause","year"],'Loc',{autoUpdate:'true'}) YIELD message RETURN message

2、新增节点与属性

CREATE (n:Loc {name:'V'})  SET n.description='测试中文分词,复联终章快上映了好激动,据说知识图谱与人工智能技术应用到了那部电影!',n.cause='测试英文分词,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n

3、检索

添加全文检索之后就可以检索:

CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:吖啶基氨基甲烷磺酰甲氧基苯胺', 100) YIELD node RETURN node

重新索引之后才能检索到:

CALL zdr.index.chineseFulltextIndexSearch('IKAnalyzer', 'description:测试~', 100) YIELD node RETURN node

五、标签交叉检索

addChineseFulltextAutoIndex/addChineseFulltextIndex支持多标签的同时检索,在建立索引时使用相同的索引名即可。
标签:Loc

CALL zdr.index.addChineseFulltextAutoIndex('Loc',["description","cause","name"],'Loc',{autoUpdate:'true'}) YIELD message RETURN message

标签:LocProvince’

CALL zdr.index.addChineseFulltextAutoIndex('Loc',["description","cause","name"],'LocProvince',{autoUpdate:'true'}) YIELD message RETURN message

检索节点:

CALL apoc.index.search('Loc', 'name:p~') YIELD node RETURN node

在这里插入图片描述

六、自定义中文分词插件(自动更新索引失败单独更新节点索引)

为了支持单节点的索引更新,开发以下过程。(三中所描述的自动更新方案失败,转为在更新节点或者新建节点的时候同步更新到对应的全文索引中。)

1、添加全文索引

CALL apoc.index.remove('Loc')
CALL zdr.index.addChineseFulltextIndex('Loc',["description","cause","year"],'Loc') YIELD message RETURN message

2、新增节点与属性并更新全文索引

CREATE (n:Loc {name:'V'})  SET n.description='测试中文分词,复联终章快上映了好激动,据说知识图谱与人工智能技术应用到了那部电影!',n.cause='测试英文分词,Mobile World Congress, the world’s largest gathering for the mobile industry, ' RETURN n

3、将2新增的节点或者更新的属性增加到索引

MATCH (n) WHERE n.name='V' WITH n CALL zdr.index.addNodeChineseFulltextIndex(n, ['description']) RETURN *

4、检索

CALL zdr.index.chineseFulltextIndexSearch('Loc', 'description:测试中文~') YIELD node RETURN node

在这里插入图片描述

七、解决事务提交超时

如果配置了事务提交超时设置,在构建索引时取消。

#********************************************************************
### Neo4j transcation timeout
###******************************************************************
#dbms.transaction.timeout=180s

使用后台脚本执行构建索引程序:

# index.sh
#!/usr/bin/env bash
nohup /neo4j-community-3.4.9/bin/neo4j-shell -file build.cql >>indexGraph.log 2>&1 &
// build.cql
CALL zdr.index.addChineseFulltextIndex('IKAnalyzer', ['description','fullname','name','lnkurl'], 'LinkedinID') YIELD message RETURN message;

八、备注

如果使用APOC自带的过程,设置自动更新配置之后即可,但是会影响性能。

apoc.autoIndex.enabled=true
// 构建示例
CALL apoc.index.addAllNodes('Loc', {Loc:["description","cause","year"]},{autoUpdate:true})

上述所有涉及到的NEO4J自定义过程参考

这篇关于NEO4J中文分词全文索引自动更新解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/744665

相关文章

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

找不到Anaconda prompt终端的原因分析及解决方案

《找不到Anacondaprompt终端的原因分析及解决方案》因为anaconda还没有初始化,在安装anaconda的过程中,有一行是否要添加anaconda到菜单目录中,由于没有勾选,导致没有菜... 目录问题原因问http://www.chinasem.cn题解决安装了 Anaconda 却找不到 An

Spring定时任务只执行一次的原因分析与解决方案

《Spring定时任务只执行一次的原因分析与解决方案》在使用Spring的@Scheduled定时任务时,你是否遇到过任务只执行一次,后续不再触发的情况?这种情况可能由多种原因导致,如未启用调度、线程... 目录1. 问题背景2. Spring定时任务的基本用法3. 为什么定时任务只执行一次?3.1 未启用

MySQL新增字段后Java实体未更新的潜在问题与解决方案

《MySQL新增字段后Java实体未更新的潜在问题与解决方案》在Java+MySQL的开发中,我们通常使用ORM框架来映射数据库表与Java对象,但有时候,数据库表结构变更(如新增字段)后,开发人员可... 目录引言1. 问题背景:数据库与 Java 实体不同步1.1 常见场景1.2 示例代码2. 不同操作

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

Jackson库进行JSON 序列化时遇到了无限递归(Infinite Recursion)的问题及解决方案

《Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursion)的问题及解决方案》使用Jackson库进行JSON序列化时遇到了无限递归(InfiniteRecursi... 目录解决方案‌1. 使用 @jsonIgnore 忽略一个方向的引用2. 使用 @JsonManagedR

Seata之分布式事务问题及解决方案

《Seata之分布式事务问题及解决方案》:本文主要介绍Seata之分布式事务问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Seata–分布式事务解决方案简介同类产品对比环境搭建1.微服务2.SQL3.seata-server4.微服务配置事务模式1

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

关于Nginx跨域问题及解决方案(CORS)

《关于Nginx跨域问题及解决方案(CORS)》文章主要介绍了跨域资源共享(CORS)机制及其在现代Web开发中的重要性,通过Nginx,可以简单地解决跨域问题,适合新手学习和应用,文章详细讲解了CO... 目录一、概述二、什么是 CORS?三、常见的跨域场景四、Nginx 如何解决 CORS 问题?五、基