solr mysql 全文搜索_全文检索Solr集成HanLP中文分词
以前发布过
HanLP
的
Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在
Github
上,欢迎改进。
HanLP中文分词solr插件支持Solr5.x,兼容Lucene5.x。
图
1
快速上手
2、
修改
solr core的配置文件${core}/conf/schema.xml:
Solr5中文分词器详细配置
对于新手来说,上面的两步可能太简略了,不如看看下面的
step by step。本教程使用Solr5.2.1,理论上兼容solr5.x。
放置
jar
将上述两个
jar放到solr-5.2.1/server/solr-webapp/webapp/WEB-INF/lib目录下。如果你想自定义词典等数据,将hanlp.properties放到solr-5.2.1/server/resources,该目录也是log4j.properties等配置文件的放置位置。HanLP文档一直在说“将配置文件放到resources目录下”,指的就是这个意思。作为Java程序员,这是基本常识。
启动
solr
首先在
solr-5.2.1\bin目录下启动solr:
1.
solr start
-f
图
2
创建
core
在
solr-5.2.1\server\solr下新建一个目录,取个名字比如叫one,将示例配置文件solr-5.2.1\server\solr\configsets\sample_techproducts_configs\conf拷贝过来,接着修改schema.xml中的默认域type,搜索
1.
2.
...
3.
替换为
1.
4.
5.
6.
7.
8.
11.
12.
13.
14.
15.
16.
17.
18.
19.
意思是默认文本字段类型启用
HanLP分词器,text_general还开启了solr默认的各种filter。
solr允许为不同的字段指定不同的分词器,由于绝大部分字段都是text_general类型的,可以说这种做法比较适合新手。如果你是solr老手的话,你可能会更喜欢单独为不同的字段指定不同的分词器及其他配置。如果你的业务系统中有其他字段,比如location,summary之类,也需要一一指定其type="text_general"。切记,否则这些字段仍旧是solr默认分词器,会造成这些字段“搜索不到”。
另外,切记不要在
query中开启indexMode,否则会影响PhaseQuery。indexMode只需在index中开启一遍即可,要不然它怎么叫indexMode呢。
如果你不需要
solr提供的停用词、同义词等filter,如下配置可能更适合你:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
完成了之后在
solr的管理界面导入这个core one:
图
3
接着就能在下拉列表中看到这个
core了:
图
4
上传测试文档
修改好了,就可以拿一些测试文档来试试效果了。
hanlp-solr-plugin代码库中的src/test/resources下有个测试文档集合documents.csv,其内容如下:
1.
id,title
2.
1,你好世界
3.
2,商品和服务
4.
3,和服的价格是每镑15便士
5.
4,服务大众
6.
5,hanlp工作正常
代表着
id从1到5共五个文档,接下来复制solr-5.2.1\example\exampledocs下的上传工具post.jar到resources目录,利用如下命令行将数据导入:
1.
java
-Dc=one -Dtype=application/csv -jar post.jar *.csv
Windows用户的话直接双击该目录下的upload.cmd即可,Linux用户运行upload.sh。
正常情况下输出如下结果:
1.
SimplePostTool version 5.0.0
2.
Posting files to [base] url http://localhost:8983/solr/one/update using content-
3.
type application/csv...
4.
POSTing file documents.csv to [base]
5.
1 files indexed.
6.
COMMITting Solr index changes to http://localhost:8983/solr/one/update...
7.
Time spent: 0:00:00.059
8.
请按任意键继续
. . .
同时刷新一下
core one的Overview,的确看到了5篇文档:
图
5
搜索文档
是时候看看
HanLP分词的效果了,点击左侧面板的Query,输入“和服”试试:
图
6
发现精确地查到了
“
和服
的价格是每镑
15便士”,而不是“商品
和服
务
”这种错误文档:
图
7
这说明
HanLP工作良好。
要知道,不少中文分词器眉毛胡子一把抓地命中
“商品和服务”这种错误文档,降低了查准率,拉低了用户体验,跟原始的MySQL LIKE有何区别?
索引模式的功能
索引模式可以对长词进行全切分,得到其中蕴含的所有词汇。比如
“中医药大学附属医院”在HanLP索引分词模式下的切分结果为:
1.
中
0 医1 药2 大3 学4 附5 属6 医7 院8
2.
[0:3 1] 中医药/n
3.
[0:2 1] 中医/n
4.
[1:3 1] 医药/n
5.
[3:5 1] 大学/n
6.
[5:9 1] 附属医院/nt
7.
[5:7 1] 附属/vn
8.
[7:9 1] 医院/n
开启
indexMode后,无论用户搜索“中医”“中医药”还是“医药”,都会搜索到“中医药大学附属医院”:
图
8
高级配置
目前本插件支持如下基于
schema.xml的配置:
图
9
对于更高级的配置,
HanLP分词器主要通过class path下的hanlp.properties进行配置,请阅读
HanLP自然语言处理包文档
以了解更多相关配置,如:
1.
停用词
2.
用户词典
3.
词性标注
4.
……
代码调用
在
Query改写的时候,可以利用HanLPAnalyzer分词结果中的词性等属性,如
1.
String text = "中华人民共和国很辽阔";
2.
for (int i = 0; i
3.
{
4.
System.out.print(text.charAt(i) + "" + i + " ");
5.
}
6.
System.out.println();
7.
Analyzer analyzer = new HanLPAnalyzer();
8.
TokenStream tokenStream = analyzer.tokenStream("field", text);
9.
tokenStream.reset();
10.
while (tokenStream.incrementToken())
11.
{
12.
CharTermAttribute attribute = tokenStream.getAttribute(CharTermAttribute.class);
13.
// 偏移量
14.
OffsetAttribute offsetAtt = tokenStream.getAttribute(OffsetAttribute.class);
15.
// 距离
16.
PositionIncrementAttribute positionAttr = kenStream.getAttribute(PositionIncrementAttribute.class);
17.
// 词性
18.
TypeAttribute typeAttr = tokenStream.getAttribute(TypeAttribute.class);
19.
System.out.printf("[%d:%d %d] %s/%s\n", offsetAtt.startOffset(), offsetAtt.endOffset(), positionAttr.getPositionIncrement(), attribute, typeAttr.type());
20.
}
在另一些场景,支持以自定义的分词器(比如开启了命名实体识别的分词器、繁体中文分词器、
CRF分词器等)构造HanLPTokenizer,比如:
1.
tokenizer = new HanLPTokenizer(HanLP.newSegment()
2.
.enableJapaneseNameRecognize(true)
3.
.enableIndexMode(true), null, false);
4.
tokenizer.setReader(new StringReader("林志玲亮相网友:确定不是波多野结衣?"));
5.
...
反馈
技术问题请
在
Github上发issue
,大家一起讨论,也方便集中管理。博客留言、微博私信、邮件不受理任何HanLP相关的问题,谢谢合作!
反馈问题的时候请一定附上版本号、触发代码、输入输出,否则无法处理。
版权
Apache License Version 2.0
转载子码农场
solr mysql 全文搜索_全文检索Solr集成HanLP中文分词相关推荐
- solr mysql 导入命令_(solr系列:四)将mysql数据库中的数据导入到solr中及删除solr中导入的数据...
在前面的博文中,已完成了在tomcat中对solr的部署,为solr添加了一个自定义的core,并且引入了ik分词器. 那么该如何将本地的mysql的数据导入到solr中呢? 准备工作: 1.mysq ...
- solr mysql数据注入_(solr系列:四)将mysql数据库中的数据导入到solr中
在前面的博文中,已完成了在tomcat中对solr的部署,为solr添加了一个自定义的core,并且引入了ik分词器. 那么该如何将本地的mysql的数据导入到solr中呢? 准备工作: 1.mysq ...
- solr mysql 增量索引_基于Solr DIH实现MySQL表数据全量索引和增量索引
实现MySQL表数据全量索引和增量索引,基于Solr DIH组件实现起来比较简单,只需要重复使用Solr的DIH(Data Import Handler)组件,对data-config.xml进行简单 ...
- MySQL 全文搜索支持, mysql 5.6.4支持Innodb的全文检索和类memcache的nosql支持
背景:搞个个人博客的全文搜索得用like啥的,现在mysql版本号已经大于5.6.4了也就支持了innodb的全文搜索了,刚查了下目前版本号都到MySQL Community Server 5.6.1 ...
- mysql against 中文_「against的用法」Mysql全文搜索之MATCH...AGAINST的用法介绍 - seo实验室...
against的用法 前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索.假定数据表名为post,有三列:id.title.content.id是自增长序号,title是varchar ...
- mysql全文搜索数字against_Mysql全文搜索match…against的用法
前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索.假定数据表名为post,有三列:id.title.content.id是自增长序号,title是varchar,content是te ...
- Mysql全文搜索之MATCH...AGAINST的用法介绍
前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索.假定数据表名为post,有三列:id.title.content.id是自增长序号,title是varchar,content是te ...
- 【转】 Mysql全文搜索match...against的用法
原文链接 http://blog.csdn.net/manbujingxin/article/details/6656992 前提:mysql只支持英文内容的全文索引,所以只考虑英文的全文搜索. 假定 ...
- mysql scws_php利用scws实现mysql全文搜索功能的方法,_PHP教程
php利用scws实现mysql全文搜索功能的方法, 本文实例讲述了php利用scws实现mysql全文搜索功能的方法.分享给大家供大家参考.具体方法如下: scws这样的中文分词插件比较不错,简单的 ...
最新文章
- db2 linux 导入数据_「软件资料」-「软件使用」-Linux 导入、导出 MySQL 数据库命令...
- 【linux】Valgrind工具集详解(五):命令行详解
- 炼个BERT别人花几分钟你花了快1天?谷歌:我这是4810亿参数的巨型BERT
- qt在windows和linux效率,QT 程序在windows和linux上的打包
- 100行php代码实现加密端口转发
- tab与list配合使用
- Linux查看设备 eth,lspci grep Eth,查看Linux下的各种硬件设备是否识别或存在之用
- 【Python基础知识-pycharm版】第十节_异常
- spring mvc Spring Data Redis RedisTemplate [转]
- b站在线解析_一个小工具,教你如何轻松下载B站上喜欢的视频!
- 谷歌:朝鲜国家黑客第二次攻击安全研究员
- [USACO13MAR]Poker Hands【贪心】
- PHP数据库操作:从MySQL原生API到PDO
- MFC 入门介绍和实例操作
- java字节码查看器_jclasslib 下载
- C# 第五章『面向对象』◆第9节:抽象类和密封类
- base64解码中文乱码
- 小白学语句:省市区选择(带全国省市区数据)
- DC基础学习(二)Synthesis Flow1
- eclipse输出中文变成乱码问题