Lucene学习笔记(2)自定义TokenFilter实现同义词

lucene自定义tokenfilter 自带payload 只要在自定义 `TokenFilter` 里给 `PayloadAttribute` 赋值,并在 FieldType 里打开 `setStoreTermVectorPayloads(true)`,就能把任意二进制/字符串 payload 跟每个分词一起存进索引,再通过 `TermsEnum/PostingsEnum` 原样读出。整段代码 零依赖(除了 lucene-core、lucene-analysis-common),直接 `main` 方法即可跑。// 简单规则:名词/动词/其它。 阅读详情
public class MyTokenFilter extends TokenFilter {


private SameWord sameWord;
private Stack<String> stack;
private State currState;
private CharTermAttribute cta = addAttribute(CharTermAttribute.class);
private PositionIncrementAttribute pia = addAttribute(PositionIncrementAttribute.class);


protected MyTokenFilter(TokenStream input, SameWord sameWord) {
super(input);
this.sameWord = sameWord;
stack = new Stack<>();
}


@Override
public final boolean incrementToken() throws IOException {
// TODO Auto-generated method stub
if (stack.size() > 0) {
// 说明有同义词
// 1、取出一个同义词
String str = stack.pop();
// 还原状态

restoreState(currState);

                        //清空原数据

cta.setEmpty();

                        //添加同义词

cta.append(str);
// 设置位置为0
pia.setPositionIncrement(0);
return true;


}
if (!input.incrementToken())
return false;
if (getSameWord(cta.toString())) {
currState = captureState();
}


return true;
}


/**
* 是否有同义词

* @param name
* @return
*/
private boolean getSameWord(String name) {
if (sameWord == null)

return false;

                 //取得该词的同义词

String[] sames = sameWord.getSameWord(name);
if (sames != null) {
for (String string : sames) {
stack.push(string);
}
return true;
}
return false;

}

 运行结果:




大数据之父_BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父” 原标题:BIM先驱Charles (Chuck) M. Eastman逝世——致敬“BIM之父”BIM研究的先驱、佐治亚理工教授Charles (Chuck) M. Eastman于本周一(11月9日)在其Atlanta家中逝世。特转韩国Yonsei大学Ghang Lee教授的讣文以作纪念。过世原因未说明。BIM的出现是与当今时代科技的发展分不开的。在信息时代建筑发展面临的挑战巨大:建筑物越建越高... 阅读详情

相关推荐

用Arduino Mega2560和TB6612驱动MG513电机,我踩过的坑和最佳实践

本文详细介绍了使用Arduino Mega2560和TB6612驱动模块控制MG513直流电机的实战经验,包括硬件连接、PWM配置、编码器信号处理等关键技巧。通过优化电源系统、信号线布局和软件控制算法,有效解决了电机抖动、转速不稳等常见问题,为机器人底盘和自动化项目提供了可靠解决方案。

weixin_42520573的博客 185

Lucene分词实现---Analyzer、TokenStream(Token、Tokenizer、Tokenfilter

一  分清概念:    1   TokenStream是用来走访Token的iterator(迭代器) ,               Tokenizer继承自TokenStream,其输入为Reader 。              TokenFilter继承自TokenStream,其作用是用来完成对TokenStream的过滤操作,譬如 去StopWords,将Token变为小

单向街的夏天 2439

Lucene如何使用TokenFilter进行再分词

Lucene如何使用TokenFilter进行再分词,里面又我的源代码和注释!!

Lucene 中的Tokenizer, TokenFilter学习

lucene中的TokenStream,TokenFilter之间关系 TokenStream是一个能够在被调用后产生语汇单元序列的类,其中有两个类型:Tokenizer和TokenFilter,两者的不同在于TokenFilter中包含了一个TokenStream作为input,该input仍然可以为一种TokenFilter进行递归封装,是一种组合模式;而Tokenzie...

weixin_30823683的博客 312

Lucene-2.2.0 源代码阅读学习(8)

Lucene分析器的实现Lucene(分词)过滤器TokenFilter类,以及继承它的子类的实现类。 TokenFilter类的继承关系,如图所示: TokenFilter是一个抽象类,定义了对一个经过分词(Tokenizer)后的TokenStream进行过滤的功能,它的源代码如下所示: package org.apache.lucene.analysi...

pavel0的专栏 254

Lucene中的Tokenizer, TokenFilter学习

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34405332的博客 422

Lucene 同义词搜索

Lucene搜索,主要是

IT、游罠的专栏 2354

Lucene中的同义词

Lucene中的同义词 LuceneTokenFilter中,有SynonymFilter和SynonymGraphFilter两种来处理同义词。 SynonymFilter不能很好的处理多词同义词,已经被弃用,建议使用SynonymGraphFilter SynonymFilter 和 SynonymGraphFilter的比较 假设有如下文本: fast wi fi network is d...

zx的博客 1739

lucene分词器中的Analyzer,TokenStream, Tokenizer, TokenFilter

TokenStream: 分词器做好处理之后得到的一个流。这个流中存储了分词的各种信息,可以通过TokenStream有效的获取到分词单元。 以下是把文件流转换成分词流(TokenStream)的过程 首先,通过Tokenizer来进行分词,不同分词器有着不同的Tokenzier,Tokenzier分完词后,通过TokenFilter对已经分好词的数据进行过滤,比如停止词。过滤完之后,把所有的数据组合成一个TokenStream;

千丈之松的专栏 2991

lucene自定义同义词实现

lucene同义词搜索原理其实是根据PositionIncrementAttribute 和 CharTermAttribute的次元记录信息来实现的,当前使用lucene版本为4.8.0首先同义词实现 packagelucene_index; importjava.io.IOException; importjava.util.Map; import...

weixin_30755393的博客 340

lucene4.5.0之同义词实现

public class MyAnalyzer extends Analyzer { private CharArraySet stopsArraySet=null; public MyAnalyzer() { super(); // TODO Auto-generated constructor stub } public MyAnalyzer(CharArr

keep_moving_cqu的专栏 2127

Lucene3.6.2入门系列】第05节_自定义停用词分词器和同义词分词器

首先是用于显示分词信息的HelloCustomAnalyzer.java package com.jadyer.lucene; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucen...

weixin_30667649的博客 130

Lucene分词基本概念

Lucene分词基本概念 Lucene接收纯文本,分词之后写入索引。 分词就是将一段文本拆分成多个词(Token),并产生与每个词相关联的一些属性(Attribute)的过程。 TokenStream、PositionIncrement和PositionLength Lucene用TokenStream来表示分词的结果。一般情况下,TokenStream可以看做是一个顺序的Token流。 例如,有...

zx的博客 934

Lucene 7.2.1 自定义TokenFilter

1.自定义TokenFilter import org.apache.lucene.analysis.TokenFilter; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; import java.io.IOE...

weixin_34107955的博客 309

Lucene】TokenStream-语汇单元的项、偏移量、类型和位置增量

代码: package com.tan.code; import java.io.IOException; import java.io.StringReader; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.analysis.TokenStream; import org.apache.lucene...

Mr_Tank_ 407

Lucene--TokenStream(TokenFilter、Tokenizer)

TokenStream即是从Document的域(field)中或者查询条件中抽取一个个分词而组成的一个数据流。继承TokenStream的类必须是final类型的,或者至少increamStoken的方法是final的,TokenStream是抽象类,两个子类如下: Tokenizer:输入为Reader的TokenStream TokenFilter:输入参数为另一个TokerStre

阿肥猪的博客 1705

7.解析Lucene-StandardAnalyzer类之---心脏(TokenFilter再继续)。

首先还是贴出来,整体TokenFilter的类图,因为前两节讲述了太多别的技术点,但是别忘了最重要的。    分析完成Attribute以后,我们继续往下分析Tokenstream类,他的代码很简单: package org.apache.lucene.analysis; import java.io.IOException; import java.io.Closeable; imp...

u012525477的博客 594

lucene+ikanalyzer实现中文同义词搜索

lucene实现索引的创建与检索;ikanalyzer实现对中文的分词;光到这里已经能够实现中文的检索了,但是光这样还不够,很多项目中的检索,应该还能够对同义词进行处理,比如索引库中有“计算机”,“电脑”这样的词条,搜索“笔记本”应该也能把“计算机”,“电脑”这样的词条匹配出来,这就涉及到对同义词的索引检索了。 两种方案: 1、在建立索引时,拆词建索引时就把同义词考虑进去,将同义词的词

yax405的专栏 5664

5.解析Lucene-StandardAnalyzer类之---心脏(TokenFilter中AttributeSource)。

             Analyzer包含两个核心组件,Tokenizer以及TokenFilter。他们各司其职完成对数据的分析。Tokenizer是字符级别处理流,TokenFilter在词语级别处理他更像是一个分析处理过滤器,我么先份子Tokenizer。少啰嗦,先看类图:     这是一个比较难分析的模块了,需要好好仔细研究。AttributeSource中也包含了很多内容。但...

u012525477的博客 462

联想开天显卡驱动下载安装包,国产主机芯片显卡驱动安装包

联想开天M显卡驱动下载安装包,国产主机芯片显卡驱动安装包

上一篇: MyBatis批量更新
下一篇: Win7下配置MySql定时自动备份
简单的小白
博客等级 码龄12年 1粉丝 5原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值