solr mysql 全文搜索_全文检索Solr集成HanLP中文分词

以前发布过

HanLP

Lucene插件,后来很多人跟我说其实Solr更流行(反正我是觉得既然Solr是Lucene的子项目,那么稍微改改配置就能支持Solr),于是就抽空做了个Solr插件出来,开源在

Github

上,欢迎改进。

HanLP中文分词solr插件支持Solr5.x,兼容Lucene5.x。

0fc739bbe55838abd3ea2f234886603c.png

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

8e758b12d41d7063b1422a525cd90b9e.png

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:

e1360bfacbf8f82ba733f5635eba8426.png

3

接着就能在下拉列表中看到这个

core了:

ecd8fe1111f57d5c17ce0e31b8b60ab2.png

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篇文档:

e9148c7c69f16a4a44f7e79587e55ecc.png

5

搜索文档

是时候看看

HanLP分词的效果了,点击左侧面板的Query,输入“和服”试试:

8ca25d438cb4d31f0303ceecaed2fa6f.png

6

发现精确地查到了

和服

的价格是每镑

15便士”,而不是“商品

和服

”这种错误文档:

4070aba0c9ea434ac0c85b58ea85bf6d.png

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后,无论用户搜索“中医”“中医药”还是“医药”,都会搜索到“中医药大学附属医院”:

c3802a3ab9270b2f47ad12b26a638198.png

8

高级配置

目前本插件支持如下基于

schema.xml的配置:

f66e770e0e5fcc9a8c523948909942f7.png

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

转载子码农场

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值