感谢http://qindongliang1922.iteye.com/blog/1927605
这篇文章让我豁然开朗~
建议研究lucene时一定要下载源码
下面代码中有个bug,,,一开始没弄没明白,在用这个分词器进行索引后发现搜不到东西。。是tokenStart和tokenEnd的错,这2个表示该词所在位置,,我这样说不知道对不对,但我感觉我的意思已经表达出来
package TEST; import java.io.IOException; import java.io.Reader; import org.apache.lucene.analysis.Tokenizer; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; import org.apache.lucene.util.AttributeFactory; public class My extends Tokenizer { private final StringBuilder buffer = new StringBuilder(); private int tokenStart = 0, tokenEnd = 0; private final static String PUNCTION = " -()/"; private final CharTermAttribute termAtt = addAttribute(CharTermAttribute.class); private final OffsetAttribute offsetAtt = addAttribute(OffsetAttribute.class); //private final TypeAttribute typeAtt = addAttribute(TypeAttribute.class); public My(Reader reader) { super(reader); } public My(AttributeFactory factory, Reader input) { super(factory, input); } @Override public boolean incrementToken() throws IOException { clearAttributes(); buffer.setLength(0); int ci; char ch; tokenStart = tokenEnd; ci = input.read(); if(ci>64&&ci<91){ ci=ci+32; } ch = (char) ci; while (true) { if (ci == -1){ if (buffer.length() == 0) return false; else { termAtt.setEmpty().append(buffer); offsetAtt.setOffset(correctOffset(tokenStart), correctOffset(tokenEnd)); return true; } } else if (PUNCTION.indexOf(ch) != -1) { //buffer.append(ch); tokenEnd++; if(buffer.length()>0){ termAtt.setEmpty().append(buffer); offsetAtt.setOffset(correctOffset(tokenStart), correctOffset(tokenEnd)); return true; }else { ci = input.read(); if(ci>64&&ci<91){ ci=ci+32; } ch = (char) ci; } } else { buffer.append(ch); tokenEnd++; ci = input.read(); if(ci>64&&ci<91){ ci=ci+32; } ch = (char) ci; } } } @Override public void reset() throws IOException { super.reset(); tokenStart = tokenEnd = 0; } @Override public void end() throws IOException { super.end(); final int finalOffset = correctOffset(tokenEnd); offsetAtt.setOffset(finalOffset, finalOffset); } }
然后开始写分词器
package TEST; import java.io.Reader; import org.apache.lucene.analysis.Analyzer; public class MyAnalyzer extends Analyzer{ @Override protected TokenStreamComponents createComponents(String fieldName, Reader reader) { return new TokenStreamComponents(new My(reader)); } }
最后测试下
package TEST; import java.io.StringReader; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; public class TestMy { public static void main(String[] args) throws Exception { MyAnalyzer ma = new MyAnalyzer(); String str = "Norther 雪中悍刀行 河北邯郸 AC DF-II-SDFzd(asd)/小时"; //MyChineseAnalyzer mc= new MyChineseAnalyzer(); 这是三劫散仙的分词器 TokenStream ts = ma.tokenStream("field", new StringReader(str)); CharTermAttribute c = ts.addAttribute(CharTermAttribute.class); ts.reset(); while (ts.incrementToken()) { System.out.println(c.toString()); } ts.end(); ts.close(); } }
测试结果:
相关推荐
Lucene4.7+IK Analyzer中文分词入门教程
lucene6.6中适配的拼音分词jar包以及ik中文分词jar包,以及自定义的分词词组包和停词包,可以实现lucene建立索引时进行拼音和中文的分词。
NULL 博文链接:https://iamyida.iteye.com/blog/2197355
2、在managed-schema(在server/solr/stu/conf目录下,这里选的自定义core即stu)文件中添加新分词器 <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/> ...
4.4 自定义分词器 26 (1) 自定义Stop分词器 26 (2) 实现简单同义词索引 27 第五章 高级搜索 32 5.1 搜索排序 34 (1) 建立搜索类 34 (2) 默认排序 35 (3) 根据评分排序 35 (4) 根据索引号排序 36 (5) 根据文件大小...
lucene实例是一个比较详细的例子,包括lucene的入门到高级实例,代码里有比较详细的实例,所有的实例都是通过junit来测试...实例包括各种搜索:如通配符查询、模糊查询、查询结果的分页、中文分词器、自定义分词器等...
索引和搜索部分利用Lucene引擎架构,实现了比Lucene自定义的中文分词更有效的中文分词,还引进了序列化和JavaCC提高索引效率和开发效率。最后给出了如何将源代码搜索引擎...
C#+Lucene.Net开发完成的一个自定义WEB搜索引擎,本项目实现了分词、模糊索引,加以Lucene.Net内部核心功能共同实现了搜索机制引擎
word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能...5、Java开源项目cws_evaluation:中文分词器分词效果评估
Lucene3.0.3+盘古分词的实现用到的dll文件,带词库文件。已证实可用,可指定使用自己维护后的词库文件。
字典条目支持导入到内存中,也就是在原有JDBM字典系统的基础上增加内存字典系统,且能方便自定义导入多少条目到内存中,能自定义使用内存还是JDBM字典系统还是两者结合起来使用,从而提高了索引创建速度;...
在做IK分词器与solr过滤器结合是时候遇到一些问题,<tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/> 在网上页找了一些jar包或者class,最后找到一个合适的源码,解决了问题。 ...
利用paoding进行中文分词,可进行自定义词典。利用lucene对文本内容进行索引和搜索并进行高亮处理。
-- ik分词器 --> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/> <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart...
特性默认支持多种分词器StandardTokenizer - 默认分词,基于词典BigramTokenizer - 二元分词,支持英文,数字识别StopwordTokenizer - 自定义过滤词,扩展类UnigramTokenizer - 一元分词可扩展的自定义分词接口支持...
中文分词器 最大匹配法(机械分词):按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功。 二元分词 一元分词 自动分类 向量距离分类算法 根据算术...
jcseg是使用Java开发的一个开源中文分词器,使用流行的mmseg算法实现,并且提供了最高版本的lucene-4.x和最高版本solr-4.x的分词接口. 1。目前最高版本:jcseg-1.9.2。兼容最高版本lucene-4.x和最高版本solr-4.x 2...
•增加了目前对最新版的Lucene、Solr、Elasticsearch开源第三方搜索框架的分词插件 效果测试——新词发现 引用 1. 未登陆词识别 example:NER:我要碎觉吊丝要小心!城西嘉南公寓 result:命名/v 实体/n ner/...
能通过自定义配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词频统计、词性标注、同义标注、反义标注、...
通过继承Analyzer编写自定义类UseSmartIKAnalyzer和NotUseSmartIKAnalyzer,实现智能分词和最细粒度分词,支持solr4.7通过配置schema.xml实现不同的分词效果 <!-- 使用智能分词 --> ...