在Lucene中很多数据是通过Attribute进行存储的

步骤是同过TokenStrem获取文本信息流

TokenStream stream = a.tokenStream("content", new StringReader(str)); (a:指的是Analyzer)

而在这里对这个由不同的分词的话之需要实现Analyer,并重写里面的tokenStream 方法

public TokenStream tokenStream(String fieldName, Reader reader) {
Dictionary dic = Dictionary.getInstance("F:\\CheckOut\\Lucene\\03_lucene_analyzer\\mmseg4j-1.8.4\\data");

return new MySameTokenFilter(new MMSegTokenizer(new MaxWordSeg(dic), reader),samewordContext);
}

然后这里获取他的Tokenizer 并可以实现自己的过滤器,以及相应的同义词删减

public class MySameTokenFilter extends TokenFilter{

    private CharTermAttribute cta = null;
private PositionIncrementAttribute pia = null;
private AttributeSource.State current = null;
private Stack<String> sames = null;
private SamewordContext samewordContext; protected MySameTokenFilter(TokenStream input,SamewordContext samewordContext) {
super(input);
cta = this.addAttribute(CharTermAttribute.class);
pia = this.addAttribute(PositionIncrementAttribute.class);
sames = new Stack<String>();
this.samewordContext=samewordContext;
} /**
* 思想如下:
* 其实每个同义词都要放在CharTermAttribute里面,但是如果直接cta.append("大陆");的话
* 那会直接把原来的词和同义词连接在同一个语汇单元里面[中国大陆],这样是不行的
* 要的是这样的效果[中国][大陆]
* 那么就要在遇到同义词的时候把当前的状态保存一份,并把同义词的数组放入栈中,
* 这样在下一个语汇单元的时候判断同义词数组是否为空,不为空的话把之前的保存的一份状态
* 还原,然后在修改之前状态的值cta.setEmpty(),然后在把同义词的值加入cta.append("大陆")
* 再把位置增量设为0,pia.setPositionIncrement(0),这样的话就表示是同义词,
* 接着把该同义词的语汇单元返回
*/
@Override
public boolean incrementToken() throws IOException {
System.out.println("yaobo");
while(sames.size() > ){
//将元素出栈,并获取这个同义词
String str = sames.pop();
//还原状态
restoreState(current);
cta.setEmpty();
cta.append(str);
//设置位置
pia.setPositionIncrement();
return true;
}
if(!input.incrementToken()) return false;
if(addSames(cta.toString())){
//如果有同义词将当前状态先保存
current = captureState();
}
return true;
}
/*
* 使用这种方式是不行的,这种会把的结果是[中国]替换成了[大陆]
* 而不是变成了[中国][大陆]
@Override
public boolean incrementToken() throws IOException {
if(!input.incrementToken()) return false;
if(cta.toString().equals("中国")){
cta.setEmpty();
cta.append("大陆");
}
return true;
}
*/
private boolean addSames(String name){ String[] sws = samewordContext.getSamewords(name);
if(sws != null){
for(String s : sws){
sames.push(s);
}
return true;
}
return false;
}
}

其思想如下

然后通过不同的Attribute进行分割

TokenStream stream = a.tokenStream("content", new StringReader(str));
//位置增量
PositionIncrementAttribute pia = stream.addAttribute(PositionIncrementAttribute.class);
//偏移量
OffsetAttribute oa = stream.addAttribute(OffsetAttribute.class);
//词元
CharTermAttribute cta = stream.addAttribute(CharTermAttribute.class);
//分词的类型
TypeAttribute ta = stream.addAttribute(TypeAttribute.class);

Lucene 分词的更多相关文章

  1. Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息

    Lucene学习-深入Lucene分词器,TokenStream获取分词详细信息 在此回复牛妞的关于程序中分词器的问题,其实可以直接很简单的在词库中配置就好了,Lucene中分词的所有信息我们都可以从 ...

  2. Hibernate Search集与lucene分词查询

    lucene分词查询参考信息:https://blog.csdn.net/dm_vincent/article/details/40707857

  3. Lucene系列三:Lucene分词器详解、实现自己的一个分词器

    一.Lucene分词器详解 1. Lucene-分词器API (1)org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分 ...

  4. WebGIS中兴趣点简单查询、基于Lucene分词查询的设计和实现

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 兴趣点查询是指:输入框中输入地名.人名等查询信息后,地图上可 ...

  5. lucene 分词实现

    一.概念认识 1.常用的Analyer SimpleAnalyzer.StopAnalyzer.WhitespaceAnalyzer.StandardAnalyzer 2.TokenStream 分词 ...

  6. lucene分词器与搜索

    一.分词器 lucene针对不同的语言和虚伪提供了许多分词器,我们可以针对应用的不同的需求使用不同的分词器进行分词.我们需要注意的是在创建索引时使用的分词器与搜索时使用的分词器要保持一致.否则搜索的结 ...

  7. 全文索引(三)lucene 分词 Analyzer

    分词: 将reader通过阅读对象Analyzer字处理,得到TokenStream处理流程被称为分割. 该解释可能是太晦涩.查看示例,这个东西是什么感性的认识. 样品:一段文本"this ...

  8. lucene分词多种方法

    目前最新版本的lucene自身提供的StandardAnalyzer已经具备中文分词的功能,但是不一定能够满足大多数应用的需要.另外网友谈的比较多的中文分词器还有:CJKAnalyzerChinese ...

  9. Lucene分词详解

    分词和查询都是以词项为基本单位,词项是词条化的结果.在Lucene中分词主要依靠Analyzer类解析实现.Analyzer类是一个抽象类,分词的具体规则是由子类实现的,所以对于不同的语言规则,要有不 ...

  10. 学习笔记(三)--Lucene分词器详解

    Lucene-分词器API org.apache.lucene.analysi.Analyzer 分析器,分词器组件的核心API,它的职责:构建真正对文本进行分词处理的TokenStream(分词处理 ...

随机推荐

  1. python教程(四)·序列

    距离上次的小项目已经休息了很长一段时间,是时候来继续本系列教程了.这一节开始我们将深入python中的数据结构. 序列的概念 在python中,最基本的数据结构是序列,序列包含一个或多个元素,每个元素 ...

  2. nohup和&后台运行,进程查看及终止 详解

    nohup 和重定向 功能一样,可用于定时启动 1.nohup 用途:不挂断地运行命令. 语法:nohup Command [ Arg … ] [ & ] 无论是否将 nohup 命令的输出重 ...

  3. 阻止Quartus优化掉信号

    使用SignalTap II Logic Analyzer观察信号,有时要观察的信号会被Quartus优化掉,这种情况下可以给信号指定属性.以下例子均使用Verilog. 1. 如果是组合逻辑信号,可 ...

  4. package html to native application

    npm install nw -g npm . https://github.com/nwjs/nw.js/ https://github.com/nwjs/nw.js/wiki/How-to-run ...

  5. 20155229 2016-2017-2 《Java程序设计》第十周学习总结

    20155229 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 网络 网络分为局域网.广域网.城域网 一次HTTP请求包含3个部分:①方法--统一资源标识符 ...

  6. 20155304 2016-2017-2 《Java程序设计》实验三 敏捷开发与XP实践

    实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验步骤 (一)敏捷开发与XP 软件工程是把系统的.有序的.可量化的方法应用到软件的开发.运营和维护上的过程.软件工程包括下列领 ...

  7. apt-get 0%

    错误如下:      www.2cto.com   使用apt-get命令安装软件时出现“0%[正在等待报头]“的提示且无法继续安装,一般出现此问题是因为安装过程中Ctrl+C强行中断或其它原因导致上 ...

  8. 【bzoj3991】[SDOI2015]寻宝游戏 树链的并+STL-set

    题目描述 给出一棵树,初始每个点都是非必经的.多次改变某个点的必经状态,并询问从任意一个点出发,经过所有必经的点并回到该点的最小路程. 输入 第一行,两个整数N.M,其中M为宝物的变动次数. 接下来的 ...

  9. 【LG4587】[FJOI2016]神秘数

    [LG4587][FJOI2016]神秘数 题面 洛谷 题解 首先我们想一想暴力怎么做 对于一段区间\([l,r]\) 我们先将它之间的数升序排序 从左往右扫, 设当前我们可以表示出的数为\([1,x ...

  10. linux安装PHP-memcache-redis扩展

    1.php memcache 扩展 http://pecl.php.net/package/memcache/3.0.8 下载文件源码 #tar zxvf memcache-3.0.8.tar#/us ...