当前位置: 首页 > news >正文

图数据库Neo4J 中文分词查询及全文检索(建立全文索引)

Neo4j的全文索引是基于Lucene实现的,但是Lucene默认情况下只提供了基于英文的分词器,下篇文章我们在讨论中文分词器(IK)的引用,本篇默认基于英文分词来做。我们前边文章就举例说明过,比如我要搜索苹果公司?首先我们要做的第一步在各个词条上创建全文索引,第二步我们根据苹果公司进行全文检索,把匹配度高的按顺序输出。下边我们一步步讲解怎么做。

# Neo4j的全文索引采用Lucene,能够对neo4j中string类型的属性建立全文索引。- 1. 能够同时为node和relationship的属性建立索引。而neo4j内嵌的索引仅能够对node的属性建立索引。
- 2. 至于字符串如何被切分和索引,取决于为lucene配置的analyzer。支持自定义Analyzer,包括lucene中没有提供的。
- 3. 能够用lucene查询语句进行查询;
- 4. 能够返回相似度score;
- 5. 能够随着节点和关系的添加、移除、修改进行自动的更新;
- 6. 自动检查一致性,如果有不一致的问题自动重建;
- 7. 在单个索引中,能够支持任意数目的文档;
- 8. 创建、删除、更新都是事务的,能够在集群中自动进行副本;
- 9. 能够通过cypher语句访问.
- 10. 能够配置为满足最终一致性。即,索引更新在提交路径中被移除,转为后台线程。利用此特性,对于性能要求高的场景,能够消除主要的写瓶颈。# 相比于Neo4j内嵌的索引,采用Lucene索引具有如下优势:- 1. neo4j的内嵌索引采用b树,其仅能够对STARTS WITH、ENDS WITH、完全相等三种条件起作用。而lucene建立的全文索引能够对任意片段的字符串进行查询。
- 2. lucene索引能够对多个label建立.
- 3. lucene索引能够对一到多个关系建立.
- 4. 能够同时应用于多个属性。与内嵌索引的Composite Index不同。Composite Index仅对满足label且同时具有所有属性的实体起作用,而全文索引则对至少满足一个label、关系类型、属性的节点或关系起作用.

1. call和yield的用法

首先看看这两个词的用方法。CALL语句用于调用数据库中的过程(Procedure),YIELD子句用于显示的选择返回结果集中的哪些部分并绑定到一个变量以供后续查询引用。简单说就是用call来调用函数,用yield来接收函数返回的结果。我们举个例子

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

这里是调用数据库中内嵌的过程db.labels()计算数据库中的总标签数。返回结果

2. 索引

在Neo4j中,有两种不同的索引类型:B-树和全文索引

可以使用Cypher创建和删除B-树索引。用户通常不必知道索引就可以使用它,因为Cypher的查询计划器会决定在哪种情况下使用哪个索引。B-树索引擅长于对所有类型的值进行精确查找,以及范围扫描,完整扫描和前缀搜索。比如(=,>,start with,contains)等

全文索引与B-树索引不同,它们针对索引和搜索文本进行了优化。它们用于需要理解语言的查询,并且仅索引字符串数据。还必须通过过程明确查询它们。全文索引需要手动去创建它,查询的时候也是手动去调用。

在理解了索引的两种概念后,我们着手看看全文索引怎么创建。

3. 创建全文索引

在第一节中用到了db.labels()的过程,那有没有内置创建全文索引的过程呢。答案当然是有了。会发现有db.index.fulltext.createNodeIndex(),那就用这个过程来开始创建一个全文索引。在Dao层代码如下,其中创建索引的名称,标签和字段通过动态传参传过去的,比如在公司,产品上创建公司名称,产品名称的全文索引名称为allFullIndex

可以手动从CQL查询界面进行创建

比如从GoodDes标签的name上创建全文索引, 并使用cjk分词器

CALL db.index.fulltext.createNodeIndex("FT_GOODDES",["GoodDes"],["name"],{analyzer:"cjk", eventually_consistent:"true"})CALL db.index.fulltext.queryNodes("FT_GOODDES", "气体导流管(旧)") YIELD node, score
WHERE score > 0.6
MATCH (node)-[:GoodAndCode]->(goodCode:GoodCode)
RETURN ID(node) AS nodeId, node.name AS goodDesName, score, ID(goodCode) AS goodCodeId, goodCode.code AS goodCodeCode;

@Repository
public interface FullIndexRepository extends Neo4jRepository<CompanyEntryNode, String> {/*** 创建索引** @param indexName  索引名称* @param labels     标签名称* @param properties 属性*/@Query("call db.index.fulltext.createNodeIndex({indexName},{labels},{properties})")void createFullIndex(String indexName, String[] labels, String[] properties);/*** 删除索引** @param indexName 索引名称*/@Query("call db.index.fulltext.drop({indexName})")void deleteFullIndexByName(String indexName);
}

service层和controller层就不写了,直接调用我们创建的过程,就成功创建了一个名称为allFullIndex的全文索引。

在这里插入图片描述

4. 查询索引

同样的有创建索引的过程,也有查询全文索引的过程db.index.fulltext.queryNodes(),那我们在dao层做如下定义。这里结果中返回了node和score。score就是按照相似度给出的一个分值,分词器会影响这个分值,node就是创建索引的节点信息。结果默认是按照score数值从高到低返回。


@Repository
public interface BaseSearchRepository extends Neo4jRepository<CompanyEntryNode, String> {/*** 查询全文检索数据** @param searchWord* @return*/@Query("call db.index.fulltext.queryNodes('allFullIndex',{searchWord}) yield node,score " +"return node.name as name,score")List<BaseSearchDto> fullTextSearch( String searchWord);}

在controller层中我们调用会返回如下结果

在这里插入图片描述

这样整个全文索引的创建和查询就完成了。

5. 其他调用过程 [一]

db.index.fulltext.drop()

描述删除指定的索引。
用法db.index.fulltext.drop(indexName :: STRING?) :: VOID

db.index.fulltext.createNodeIndex()

描述为给定的标签和属性创建节点全文索引。可选的“ config”映射参数可用于为索引提供设置。支持的设置是“分析器”,用于指定在建立索引和查询时要使用的分析器。使用以下db.index.fulltext.listAvailableAnalyzers步骤查看可用的选项。可以将’eventually_consistent’设置为’true’,以使该索引最终保持一致,从而将来自提交事务的更新应用于后台线程。
语法db.index.fulltext.createNodeIndex(indexName :: STRING?, labels :: LIST? OF STRING?, properties :: LIST? OF STRING?, config = {} :: MAP?) :: VOID

db.index.fulltext.createRelationshipIndex()

描述查询给定的全文索引。返回匹配关系及其Lucene查询分数,按分数排序。选项映射的有效键是:'skip’跳过前N个结果;'limit’限制返回的结果数。
用法`db.index.fulltext.queryRelationships(indexName :: STRING?, queryString :: STRING?, options = {} :: MAP?) :: (relationship :: RELATIONSHIP?, score :: FLOAT?)```

db.index.fulltext.queryRelationships()

描述为给定的关系类型和属性创建一个关系全文本索引。可选的“ config”映射参数可用于为索引提供设置。支持的设置是“分析器”,用于指定在建立索引和查询时要使用的分析器。使用以下db.index.fulltext.listAvailableAnalyzers步骤查看可用的选项。可以将’eventually_consistent’设置为’true’,以使该索引最终保持一致,从而将来自提交事务的更新应用于后台线程。
用法db.index.fulltext.createRelationshipIndex(indexName :: STRING?, relationshipTypes :: LIST? OF STRING?, properties :: LIST? OF STRING?, config = {} :: MAP?) :: VOID

db.index.fulltext.queryNodes()

描述查询给定的全文索引。返回匹配的节点及其Lucene查询分数,按分数排序。选项映射的有效键是:'skip’跳过前N个结果;'limit’限制返回的结果数。
用法db.index.fulltext.queryNodes(indexName :: STRING?, queryString :: STRING?, options = {} :: MAP?) :: (node :: NODE?, score :: FLOAT?)

db.index.fulltext.listAvailableAnalyzers()

描述列出可以配置全文本索引的可用分析器。
用法db.index.fulltext.listAvailableAnalyzers() :: (analyzer :: STRING?, description :: STRING?, stopwords :: LIST? OF STRING?)

6. 其他调用过程 [二]

https://blog.csdn.net/xiaqingyin/article/details/105567306

在这里插入图片描述

7. 举例 - 创建和配置、查询、删除全文索引

使用全文索引进行创建

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

CALL db.index.fulltext.createNodeIndex("titlesAndDescriptions",["Movie", "Book"],["title", "description"])

想要使用以上索引搜索标题或者描述中包含“matrix”的节点,调用如下cypher语句。

CALL db.index.fulltext.queryNodes("titlesAndDescriptions", "matrix") YIELD node, score
RETURN node.title, node.description, score

创建关系索引,以及可选参数config的使用。

CALL db.index.fulltext.createRelationshipIndex("taggedByRelationshipIndex",["TAGGED_AS"],["taggedByUser"], { analyzer: "url_or_email", eventually_consistent: "true" })

使用全文索引进行查询

CALL db.index.fulltext.queryNodes("titlesAndDescriptions", "Full Metal Jacket") YIELD node, score
RETURN node.title, score

可以用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

删除全文索引

CALL db.index.fulltext.drop("taggedByRelationshipIndex")

8. 全文检索之中文分词器

其实用了这么久,我感觉用不用中文的全文索引影响不是很大

说说二种方式实现中文全文索引的创建。

1). 利用系统自带的分词器

我们在创建全文索引函数的时候是可以指定索引的分词器的,他的分词器可用下边的方式查询:

call db.index.fulltext.listAvailableAnalyzers

在这里插入图片描述

查到很多系统自带的分词器,其中有一个是“cjk”是针对中国,日本,韩国做的分词器,所以说是支持中文分词的。所以可以这样建索引,像下边指定analyzer的类型为“cjk”就指定的分词器的类型。

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

2). 通过第三方库来创建全文索引

参考https://zhuanlan.zhihu.com/p/364927850

未验证

通过查找有第三方库neo4j-graph-plugin-1.0.1.jar,这个不确定是不是官方的还是别人提供的,git下载地址:

https://github.com/crazyyanchao/ongdb-lab-apoc

下载neo4j-graph-plugin-1.0.1.jar文件,放到neo4j的plugins目录下,该插件对应的ik版本为:IKAnalyzer-5.0,支持LUCENE-5.5.0。修改配置文件,然后重启neo4j服务。

dbms.security.procedures.unrestricted=apoc.*,zdr.*

安装好后执行,如果不报错,表示安装成功。初次会失败!

RETURN zdr.apoc.hello("你好") as greeting

运行函数zdr.index.iKAnalyzer会报莫名其妙的错误,经过测试需要继续从https://github.com/crazyyanchao/neo4j-graph-plugin下载neo4j-graph-plugin-master.zip文件,解压缩后取出其中的dic目录拷贝到neo4j根目录下,否则一直运行失败,因为他需要找分词文件目录,和java中引用IK分词一样。dic目录下的分词文件user_defined.dic可以添加自定义的分词。如果想修改用户自定义词典的位置,可以修改配置文件:

vim dic/dic-cfg/IKAnalyzer.cfg.xml

在这里插入图片描述

以上配置好了之后创建中文索引,CompanyFullIndex是索引名称,CompanyEntry是节点。

CALL zdr.index.addChineseFulltextIndex('CompanyFullIndex', ["name"], 'CompanyEntry') YIELD message RETURN message

这里的语法和系统库里的稍微参数位置不一样,其他逻辑都是一样的。查询的方法如下。

CALL zdr.index.chineseFulltextIndexSearch('CompanyFullIndex', 'name:测试~') YIELD node RETURN node

相关文章:

图数据库Neo4J 中文分词查询及全文检索(建立全文索引)

Neo4j的全文索引是基于Lucene实现的&#xff0c;但是Lucene默认情况下只提供了基于英文的分词器&#xff0c;下篇文章我们在讨论中文分词器&#xff08;IK&#xff09;的引用&#xff0c;本篇默认基于英文分词来做。我们前边文章就举例说明过&#xff0c;比如我要搜索苹果公司&…...

element-china-area-data使用问题

使用CodeToText报错&#xff0c;下载的时候默认下载最新版本的&#xff0c; 稳定版本5.0.2版本才可以 npm install element-china-area-data5.0.2 -S...

248: vue+openlayers 以静态图片作为底图,并在上面绘制矢量多边形

第248个 点击查看专栏目录 本示例是演示如何在vue+openlayers项目中以静态图片作为底图,并在上面绘制矢量多边形。这里主要通过pixels的坐标作为投射,将静态图片作为底图,然后通过正常的方式在地图上显示多边形。注意的是左下角为[0,0]。 直接复制下面的 vue+openlayers源代…...

thinkphp6(TP6)访问控制器报404(Nginx)

起因&#xff1a; 安装thinphp6后&#xff0c;发现无法访问控制器&#xff0c;直接通过URL访问&#xff0c;就报错404。 错误原因&#xff1a; Nginx不支持URL的 PathInfo。 解决方法&#xff1a; 配置伪静态。 伪静态代码&#xff1a; location / {if (!-e $request_filen…...

腾讯云轻量应用服务器使用场景列举说明

腾讯云轻量应用服务器&#xff08;TencentCloud Lighthouse&#xff09;是新一代开箱即用、面向轻量应用场景的云服务器产品&#xff0c;轻量应用服务器可用于搭建中小型网站、Web应用、博客、论坛、小程序/小游戏、电商、云盘/图床、云端开发测试和学习环境等轻量级、中低负载…...

【漏洞复现】IP-guard WebServer 远程命令执行

漏洞描述 IP-guard是一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。互联网上披露IP-guard WebServer远程命令执行漏洞情报。攻击者可利用该漏洞执行任意命令,获取服务器控制权限。 免责声明 技术文章仅供参考,任何个人和…...

23111704[含文档+PPT+源码等]计算机毕业设计springboot办公管理系统oa人力人事办公

文章目录 **软件开发环境及开发工具&#xff1a;****功能介绍&#xff1a;****实现&#xff1a;****代码片段&#xff1a;** 编程技术交流、源码分享、模板分享、网课教程 &#x1f427;裙&#xff1a;776871563 软件开发环境及开发工具&#xff1a; 前端技术&#xff1a;jsc…...

在Linux系统上检测GPU显存和使用情况

在Linux系统上&#xff0c;你可以使用一些命令行工具来检测GPU显存和使用情况。以下是一些常用的方法&#xff1a; 1. 使用nvidia-smi&#xff08;仅适用于NVIDIA GPU&#xff09; 如果你使用的是NVIDIA的显卡&#xff0c;你可以使用nvidia-smi命令来获取显卡信息&#xff0c…...

内网穿透 cpolar

通过 cpolar软件 可以获得一个临时域名&#xff0c;而这个临时域名是一个 公网ip 下载与安装 下载地址&#xff1a;https://dashboard.cpolar.com/get-started 安装过程中&#xff0c;一直下一步即可 验证 进入官网验证页面复制 authtoken打开 cmd 进入安装目录执行命令&#…...

ai剪辑矩阵系统源码+无人直播系统源码技术开发

开发AI剪辑矩阵系统和无人直播系统源码&#xff0c;需要以下步骤&#xff1a; 1. 市场调研&#xff1a;了解市场需求和竞品情况&#xff0c;明确系统的功能和特点。 2. 系统设计&#xff1a;设计系统的整体架构和功能模块&#xff0c;包括视频剪辑、直播推流、实时互动、数据分…...

2311rust,到38版本更新

1.35.0稳定版 此版本亮点是分别为Box<dyn FnOnce>,Box<dyn FnMut>和Box<dyn Fn>实现了FnOnce,FnMut和Fn闭包特征. 此外,现在可按不安全的函数指针转换闭包.现在也可无参调用dbg!. 为Box<dyn Fn*>实现Fn*装饰特征. 以前,如果要调用在盒子闭包中存储的…...

腾讯云4核8G服务器配置价格表,轻量和CVM标准型S5实例

腾讯云4核8G服务器S5和轻量应用服务器优惠价格表&#xff0c;轻量应用服务器和CVM云服务器均有活动&#xff0c;云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元&#xff0c;5年6490.44元&#xff0c;轻量应用服务器4核8G12M带宽一年446元、529元15个月&#xff0c;腾讯云…...

Android 屏幕适配

目录 一、为什么要适配 二、几个重要的概念 2.1 屏幕尺寸 2.2 屏幕分辨率 2.3 屏幕像素密度 2.4 屏幕尺寸、分辨率、像素密度三者关系 三、常用单位 3.1 密度无关像素(dp) 3.2 独立比例像素&#xff08;sp&#xff09; 3.3 dp与px的转换 四、解决方案 4.1 今日头条…...

Python使用Mechanize库完成自动化爬虫程序

目录 引言 一、了解Mechanize库 二、安装Mechanize库 三、使用Mechanize库发送HTTP请求 四、使用Mechanize库解析HTML页面 五、使用Mechanize库模拟用户输入 六、使用Mechanize库处理JavaScript动态生成的内容 七、使用Mechanize库处理登录和表单提交的常见问题 总结 …...

【Shell脚本入门】

Shell中的特殊符号 1.$ 美元符号&#xff0c;用来表示变量的值。 如变量NAME的值为Mike&#xff0c;则使用$NAME就可以得到“Mike”这个值。2.# 井号&#xff0c;除了做为超级用户的提示符之外&#xff0c;还可以在脚本中做为注释的开头字母&#xff0c;每一行语句中&#xff…...

redis大全

redis-cli 常用命令 redis常用命令 redis数据结构 redis数据结构 redis持久化存储 持久化存储 redis事务 redis事务 redis管道 管道 redis7集群搭建 集群 redis常见问题以及解决方案 常见问题以及解决方案 redis面试题 面试题 redis高级案列case 高级case sp…...

linux rsyslog日志采集格式设定五

linux rsyslog日志采集格式设定五 1.创建日志接收模板 打开/etc/rsyslog.conf文件,在GLOBAL DIRECTIVES模块下任意位置添加以下内容 命令: vim /etc/rsyslog.conf 测试:rsyslog.conf文件结尾添加以下内容 $template ztj,"%fromhost-ip% %app-name% %syslogseveri…...

uni-app:如何配置uni.request请求的超时响应时间(全局+局部)

方法一&#xff1a;全局配置响应时间 一、进入项目的manifest.json的代码视图模块 二、写入代码 "networkTimeout": {"request": 5000 }, 表示现在request请求响应时间最多位5秒 方法二&#xff1a;局部设置响应时间 一、直接在uni.request中写入属性…...

AI中文版怎么用,版本分享,GPT官网入口

网页版上线啦&#xff0c;在线助力大学生、上班族的高效生活&#xff01; GPT4.0是OpenAI最新推出的聊天模型&#xff0c;它的语言理解和生成能力比以前的版本更强大。对于忙碌的上班族来说&#xff0c;GPT4.0能帮助你高效处理工作中的大部分写作任务&#xff0c;比如撰写报告…...

mysql数据库通过binlog恢复数据

1&#xff1a;通过命令查询是否开启 show variables like log_bin2&#xff1a;查看binlog文件存放目录 show variables like %datadir%3&#xff1a;通过positon恢复 mysqlbinlog --start-position219 --stop-position636 --databasetest "/data/binlog.00001" …...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

React---day11

14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store&#xff1a; 我们在使用异步的时候理应是要使用中间件的&#xff0c;但是configureStore 已经自动集成了 redux-thunk&#xff0c;注意action里面要返回函数 import { configureS…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...