看一下继承图,Tokenizer和TokenFilter都是继承于TokenStream,TokenStream继承了AttributeSource

package com.lucene.demo.analizer;

import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenFilter;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.util.Attribute;
import org.apache.lucene.util.AttributeImpl;
import org.apache.lucene.util.AttributeReflector; import java.io.IOException; public class SansamAnalyzer extends Analyzer{
/**
*
*/ @Override
protected TokenStreamComponents createComponents(String fieldName) {
//装饰器模式,将分出的词项用filter进行处理,可以链式装饰实现多个filter
MyTokenizer myTokenizer = new MyTokenizer();
MyLowerCaseTokenFilter myLowerCaseTokenFilter = new MyLowerCaseTokenFilter(myTokenizer);
return new TokenStreamComponents(myTokenizer, myLowerCaseTokenFilter);
} public static class MyTokenizer extends Tokenizer{
//调用AttributeSource-addAttribute方法
//维护了一个attributes Map,实现可复用
//private final Map<Class<? extends Attribute>, AttributeImpl> attributes;
//private final Map<Class<? extends AttributeImpl>, AttributeImpl> attributeImpls; MyAttribute attribute = this.addAttribute(MyAttribute.class); char[] buffer = new char[255];
int length = 0;
int c; @Override
public boolean incrementToken() throws IOException {
//进行分析处理逻辑
clearAttributes();
length = 0;
while (true){
c = this.input.read();
if(c == -1){
if(length > 0){
this.attribute.setChar(buffer,length);
return true;
}else {
return false;
}
} if(Character.isWhitespace(c)){
if(length > 0){
this.attribute.setChar(buffer,length);
return true;
}
} buffer[length++] = (char)c;
}
}
} public static class MyLowerCaseTokenFilter extends TokenFilter{
public MyLowerCaseTokenFilter(TokenStream s){
super(s);
} MyAttribute attribute = this.addAttribute(MyAttribute.class); @Override
public boolean incrementToken() throws IOException {
//获取一个分词项进行处理
boolean b = this.input.incrementToken();
if (b){
char[] chars = this.attribute.getChar();
int length = this.attribute.getLength();
if(length > 0){
for (int i = 0; i < length; i++) {
chars[i] = Character.toLowerCase(chars[i]);
}
}
} return b;
}
} /**
* 自定义Attribute属性接口 继承Attribute
*/
public static interface MyAttribute extends Attribute { void setChar(char [] c, int length); char [] getChar(); int getLength(); String getString();
} /**
* 必须使用interface+Impl 继承AttributeImpl
*/
public static class MyAttributeImpl extends AttributeImpl implements MyAttribute { char [] term = new char[255];
int length = 0; @Override
public void setChar(char[] c, int length) {
this.length = length;
if(c.length > 0){
System.arraycopy(c,0,term,0,length);
}
} @Override
public char[] getChar() {
return term;
} @Override
public int getLength() {
return length;
} @Override
public String getString() {
if(length > 0){
return new String(term,0,length);
}
return null;
// return new String(term); //不能直接返回 因为长度问题 默认255字符
} @Override
public void clear() {
term = null;
term = new char[255];
this.length = 0;
} @Override
public void reflectWith(AttributeReflector reflector) { } @Override
public void copyTo(AttributeImpl target) { }
} public static void main(String[] args) {
String text = "Hello World A b C";
try(SansamAnalyzer analyzer = new SansamAnalyzer();
//调用tokenStream()时 会先得到TokenStreamComponents对象 得到了MyLowerCaseTokenFilter 对象 观察其构造方法及此方法的返回值
TokenStream stream = analyzer.tokenStream("title",text);){
MyAttribute attribute = stream.getAttribute(MyAttribute.class);
stream.reset();
while (stream.incrementToken()){
System.out.print(attribute.getString()+" | ");
}
stream.end();
}catch (Exception e){
e.printStackTrace();
}
}
}

Lucene实现自己的英文空格小写分词器的更多相关文章

  1. lucene整理3 -- 排序、过滤、分词器

    1.    排序 1.1. Sort类 public Sort() public Sort(String field) public Sort(String field,Boolean reverse ...

  2. Lucene的中文分词器IKAnalyzer

    分词器对英文的支持是非常好的. 一般分词经过的流程: 1)切分关键词 2)去除停用词 3)把英文单词转为小写 但是老外写的分词器对中文分词一般都是单字分词,分词的效果不好. 国人林良益写的IK Ana ...

  3. Lucene介绍及简单入门案例(集成ik分词器)

    介绍 Lucene是apache软件基金会4 jakarta项目组的一个子项目,是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和 ...

  4. elasticsearch 分析器 分词器

    参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-tokenizers.html 在全文搜索(Fu ...

  5. Elasticsearch之文档的增删改查以及ik分词器

    文档的增删改查 增加文档 使用elasticsearch-head查看 修改文档 使用elasticsearch-head查看 删除文档 使用elasticsearch-head查看 查看文档的三种方 ...

  6. Restful认识和 IK分词器的使用

    什么是Restful风格 Restful是一种面向资源的架构风格,可以简单理解为:使用URL定位资源,用HTTP动词(GET,POST,DELETE,PUT)描述操作. 使用Restful的好处: 透 ...

  7. IK分词器 原理分析 源码解析

    IK分词器在是一款 基于词典和规则 的中文分词器.本文讲解的IK分词器是独立于elasticsearch.Lucene.solr,可以直接用在java代码中的部分.关于如何开发es分词插件,后续会有文 ...

  8. ElasticSearch-IK分词器和集成使用

    1.查询存在问题分析 在进行字符串查询时,我们发现去搜索"搜索服务器"和"钢索"都可以搜索到数据: 而在进行词条查询时,我们搜索"搜索"却没 ...

  9. 三、Solr多核心及分词器(IK)配置

    多核心的概念 多核心说白了就是多索引库.也可以理解为多个"数据库表" 说一下使用multicore的真实场景,比若说,产品搜索和会员信息搜索,不使用多核也没问题,这样带来的问题是 ...

随机推荐

  1. js 字符串操作方法

    1.字符串转换 你可以将任何类型的数据都转换为字符串,你可以用下面三种方法的任何一种: 1 2 var num= 19; // 19 var myStr = num.toString(); // &q ...

  2. POIUtils 读取 poi

    依赖: <!-- ############ poi ############## --> <dependency> <groupId>org.apache.poi& ...

  3. activiti官网实例项目activiti-explorer之扩展流程节点属性2

    情景需求:需要查找activiti-explorer项目中获取流程id的方法,然后根据流程id获取相应字段在节点属性中添加内容. 大致流程:拿取整个流程id获取对应表单属性,在页面节点属性中展示对应表 ...

  4. 阿里云安装mysql后查看不到初始密码的解决办法

    在阿里云安装mysql后用grep 'A temporary password' /var/log/mysqld.log命令查看MySQL初始密码,毛线都没有看到,然后直接到/var/log/mysq ...

  5. 贝叶斯公式与最大后验估计(MAP)

    1, 频率派思想 频率派思想认为概率乃事情发生的频率,概率是一固定常量,是固定不变的 2, 最大似然估计 假设有100个水果由苹果和梨混在一起,具体分配比例未知,于是你去随机抽取10次,抽到苹果标记为 ...

  6. camstart API 服务器负载均衡

    docker 安装haproxy docker pull haproxy 创建配置文件到:D:/docker/haproxy 配置文件内容如下 # 配置文件 # 全局配置 global # 设置日志文 ...

  7. ansible简介,简单实用

    Ansible ansilbe是实现自动化运维的工具,基于python开发,实现批量系统配置,批量程序部署,批量运行命令等功能. ansible是基于模块工作的,自身是没有批量部署的能力.真正具有批量 ...

  8. rest_framework_extensions实现缓存

    1.安装包 pip install drf-extensions pip install django-redis pip install django-redis-cache 2.配置redis # ...

  9. python 推导式

    推导式又称解析式,是Python的一种独有特性.目的是可以从一个数据序列推导出另一个数据序列,适用于python 的list ,dict 和集合 list中的推导式: _list=[i for i i ...

  10. JAVA获取客户端请求的当前网络ip地址(附:Nginx反向代理后获取客户端请求的真实IP)

    1. JAVA获取客户端请求的当前网络ip地址: /** * 获取客户端请求的当前网络ip * @param request * @return */ public static String get ...