文档章节

关于Solr6.3标准分词源码分析一(如何改动源码,达到分词特殊符号的功能)

成都老码农
 成都老码农
发布于 2017/03/09 18:24
字数 1045
阅读 40
收藏 0

 最近一直在研究solr的源码,主要是标准分词源码分析:

    solr底层是使用的是Lucene,标准分词的问题其实 也是lucene的底层的问题。

闲话不多说,最近在项目中遇到各种与公司业务相悖的问题,开始使用solr6.3配置一个单机的solr,分词用的是目前国内比较流行的ik分词器,分词速度和索引速度,也比较可以,但是在搜索的时候遇到了很多问题,也是分词造成的问题,其中包括:搜索漏词、漏新闻、关键字新增的问题,最后考虑到公司没有目前词库量没有那么大,而且公司搜索那块业务,是不断更新新词,所以决定采用一元分词,(标准分词),用标准分词的确满足了公司的搜索业务,但是不用考虑新增关键字,搜索中词量不足造成的影响。

    但是在搜索时 却还是有一些问题,比如用标准分词,搜索“国美” 结果会匹配出 “国,美”这类信息,搜索会出现误差,一些特殊符号,也不能搜索分词 如“C++、C#”,因此我下载solr的源码 ,准备对分词这块源码进行一些调整,适合于我们业务 。

solr源码包 本身不是 一个java项目,是一个 基于ant的文件,需要下载 ant工具,这个 可以百度自己安装,安装成功后,还需要一个ivy插件,具体操作百度;简单的一些配置。然后打成源码包,导入eclipse中,就可以随心所欲的研究源码了。

开始 分析源码》》》

solr的标准分词源码入口都是一个 StandardTokenizerFactory 的类;solr在建立索引和搜索的时候需要拆分它们、并做一些相应的处理(比如英文要去掉介词、转成小写、单词原形化等,中文要恰当地要分词)。这些工作,一般由Analyzers、Tokenizers、和Filter来实现。这三个都是在配置在fieldType中。

ananlyzer:告诉solr在建立索引和搜索的时候,如何处理text类型的内容,比如要不要去掉“a”、去掉介词、去掉复数,要不要全部变成小写等等。。。它在managed-schema文件中配置,可以直接指定一个类给它;也可以由tokenizer和filter的组合来实现:

  • type:可选参数,index或query,表名这个配置是在建立索引还是在搜索的时候使用
  • tokenizer:分词器,比如:StandardTokenizerFactory
  • filter:过滤器,比如:LowerCaseFilterFactory,小写转换
  • Analyzer负责把文本field转成token流,然后自己处理、或调用Tokenzier和Filter进一步处理,Tokenizer和Filter是同等级和顺序执行的关系,一个处理完后交给下一个处理代码如下:

     
  • 再通过filter过滤大小写、同义词、和数字等操作。

上面代码是,停用词相关的操作

Tokenizer和Filter的区别

  • Tokenizer:接收text(通过从solr那里获得一个reader来读取文本),拆分成tokens,输出token stream
  • Filter:接收token stream,对每个token进行处理(比如:替换、丢弃、不理),输出token stream

因此,在配置文件中,Tokenizer放在第一位,Filter放在第二位直到最后一位。

  • token:标记、记号,solr中被用来索引或搜索的最小元素,比如英文单词的原形、中文的词语。tokenize:分词,tokenizer:分词器。
  • stem:词干,EnglishPorterFilterFactory负责把单词还原成词干,比如:hugs, hugging, hugged -> hug。
  • 最后重点:修改分词器让分词适合我们自己的业务
    package org.apache.lucene.analysis.standard.StandardTokenizerImpl.java    Java文件753行的位置添加判断如果输入的字符(zzInput)为- ,就将zzNext (The transition table of the DFA)值设置为2,”-“在(ASCII 表)十进制的值为:45 详情参考下图
    if(zzInput==45) {
             zzNext = 2}

 

solr源码位置在

这样就能让solr分词,分出特殊字符

分词结果如下:

© 著作权归作者所有

成都老码农
粉丝 5
博文 39
码字总数 77339
作品 0
成都
程序员
私信 提问
jieba中文分词源码分析(一)

一、缘由 接触自然语言处理(NLP)有段时间,理论知识有些了解,挺想动手写些东西,想想开源界关于NLP的东西肯定不少,其中分词是NLP的基础,遂在网上找了些资源,其中结巴分词是国内程序员用p...

gfsfg8545
2015/09/03
0
0
Elasticsearch 2.3.3 中文IK分词插件安装

我们知道搜索引擎接收搜索请求的第一步,就是对要查询的内容做做分词,Elasticsearch 2.3.3像其他搜索引擎一样,默认的标准分词器(standard)并不适合中文, 我们常用的中文分词插件是IK An...

老猿
2016/06/21
454
3
[转]与Lucene 4.10配合的中文分词比较(标准详细的比较)

本文转自: http://www.hansight.com/blog-lucene4.10-with-chinese-segment.html 感谢原作者。 比较目的 衡量每种分词的指标,内存消耗、CPU消耗,得到一个在Lucene中比较好的分词版本。 分...

狮子的魂
2015/01/18
7.9K
7
【NLP】【二】jieba源码分析之分词

【一】词典加载 利用jieba进行分词时,jieba会自动加载词典,这里jieba使用python中的字典数据结构进行字典数据的存储,其中key为word,value为frequency即词频。 1. jieba中的词典如下: ji...

muqiusangyang
2018/11/02
190
0
HanLP用户自定义词典源码分析详解

官方文档及参考链接 关于词典问题Issue,首先参考:FAQ 自定义词典其实是基于规则的分词,它的用法参考这个issue 如果有些数量词、字母词需要分词,可参考:P2P和C2C这种词没有分出来,希望加...

左手的倒影
2018/11/02
60
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员web前端教程分享web前端入门基础知识

  好程序员web前端教程分享web前端入门基础知识,作为合格的Web前端工程师必须得掌握HTML、CSS和JavaScript。只懂其中一两个还不行,必须对这三门语言都要熟悉。下面我们一起来看一看吧! ...

好程序员官网
28分钟前
3
0
elasticsearch 中文分词插件IK-Analyze

elasticsearch 版本 7.3 安装中文分词插件 插件对应的版本需要和elasticsearch的版本一致 插件各个版本下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases 使用elastic...

kdy1994
32分钟前
4
0
只用一套解决方案,就可解决80%的交通物流行业信息难题

行业背景 新中国成立70多年来,中国交通运输总体上已经形成了多节点、全覆盖的综合运输网络,“五纵五横”综合运输大通道基本贯通,一大批综合客运、货运枢纽站场(物流园区)投入运营,取得...

朕想上头条
34分钟前
4
0
spring-boot结合AOP实现数据源动态配置

Spring-Boot+AOP方式实现多数据源切换 设计总体思路:Spring-Boot+AOP方式实现多数据源切换,继承AbstractRoutingDataSource实现数据源动态的获取,在service层使用注解指定数据源。 一、多数...

蜗牛伊
35分钟前
3
0
干货 | 京东技术中台的Flutter实践之路

在 2019 年,Flutter 推出了多个正式版本,支持的终端越来越多,使用的项目也越来越多。Flutter 正在经历从小范围尝鲜到大面积应用的过程,越来越多的研发团队加入到 Flutter 的学习热潮中,...

京东云技术新知
38分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部