推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > Neo4j权威指南 > Neo4j全文检索之中文分词器(二)

Neo4j全文检索之中文分词器(二)

Neo4j权威指南 2021-04-15
在上篇文章中 介绍了全文索引的创建和如何全文搜索。理解起来也很简单。文章末尾留个了一个问题,如何创建中文的全文索引。其实用了这么久,我感觉用不用中文的全文索引影响不是很大,但是留了问题,我们就说说三种方式实现中文全文索引的创建。
第一种:利用系统库里自带的过程函数
我们在创建全文索引函数的时候是可以指定索引的分词器的,他的分词器可用下边的方式查询:
call db.index.fulltext.listAvailableAnalyzers

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

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

第二种:通过第三方库来创建全文索引

通过查找有第三方库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版本为: IKAnaly zer-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

Neo4j全文检索之中文分词器(二)

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

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

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

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

第三种:通过创建java代码,自己配置索引类型(这种没试过,因为我是用spring data neo4j框架)

首先指定IKAnalyzer作为lucene分词的analyzer,并对所有Node的指定属性新建全文索引,这里要引入IK的maven包。
 @Override public void createAddressNodeFullTextIndex () { try (Transaction tx = graphDBService.beginTx()) { IndexManager index = graphDBService.index(); Index<Node> addressNodeFullTextIndex = index.forNodes( "addressNodeFullTextIndex", MapUtil.stringMap(IndexManager.PROVIDER, "lucene", "analyzer", IKAnalyzer.class.getName()));  ResourceIterator<Node> nodes = graphDBService.findNodes(DynamicLabel.label( "AddressNode")); while (nodes.hasNext()) { Node node = nodes.next(); //对text字段新建全文索引 Object text = node.getProperty( "text", null); addressNodeFullTextIndex.add(node, "text", text); } tx.success(); }
调用逻辑

public class AddressNodeNeoDaoTest { @Autowired GraphDatabaseService graphDBService; @Test public void test_selectAddressNodeByFullTextIndex() { try (Transaction tx = graphDBService.beginTx()) { IndexManager index = graphDBService.index(); Index<Node> addressNodeFullTextIndex = index.forNodes("addressNodeFullTextIndex" , MapUtil. stringMap(IndexManager.PROVIDER, "lucene", "analyzer" , IKAnalyzer.class.getName())); IndexHits<Node> foundNodes = addressNodeFullTextIndex.query("text" , "苏州 教育 公司" ); for (Node node : foundNodes) { AddressNode entity = JsonUtil.ConvertMap2POJO(node.getAllProperties(), AddressNode. class, false, true); System. out.println(entity.getAll地址实全称()); } tx.success(); } }
好了三种方式都讲完了,至于哪种方便使用,看个人了。


- 本期完 -


有疑问请点赞哈Neo4j全文检索之中文分词器(二),我会及时回复。由于微信限制了公众号留言功能,有问题你可以直接发公众号聊天,我会在下期文章末尾解答你的问题。


为方便看最新内容,记得关注哦Neo4j全文检索之中文分词器(二)Neo4j全文检索之中文分词器(二)  

版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《Neo4j全文检索之中文分词器(二)》的版权归原作者「Neo4j权威指南」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注Neo4j权威指南微信公众号

Neo4j权威指南微信公众号:Neo4jQwzn

Neo4j权威指南

手机扫描上方二维码即可关注Neo4j权威指南微信公众号

Neo4j权威指南最新文章

精品公众号随机推荐