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

  1. package com.lucene.demo.analizer;
  2. import org.apache.lucene.analysis.Analyzer;
  3. import org.apache.lucene.analysis.TokenFilter;
  4. import org.apache.lucene.analysis.TokenStream;
  5. import org.apache.lucene.analysis.Tokenizer;
  6. import org.apache.lucene.util.Attribute;
  7. import org.apache.lucene.util.AttributeImpl;
  8. import org.apache.lucene.util.AttributeReflector;
  9. import java.io.IOException;
  10. public class SansamAnalyzer extends Analyzer{
  11. /**
  12. *
  13. */
  14. @Override
  15. protected TokenStreamComponents createComponents(String fieldName) {
  16. //装饰器模式,将分出的词项用filter进行处理,可以链式装饰实现多个filter
  17. MyTokenizer myTokenizer = new MyTokenizer();
  18. MyLowerCaseTokenFilter myLowerCaseTokenFilter = new MyLowerCaseTokenFilter(myTokenizer);
  19. return new TokenStreamComponents(myTokenizer, myLowerCaseTokenFilter);
  20. }
  21. public static class MyTokenizer extends Tokenizer{
  22. //调用AttributeSource-addAttribute方法
  23. //维护了一个attributes Map,实现可复用
  24. //private final Map<Class<? extends Attribute>, AttributeImpl> attributes;
  25. //private final Map<Class<? extends AttributeImpl>, AttributeImpl> attributeImpls;
  26. MyAttribute attribute = this.addAttribute(MyAttribute.class);
  27. char[] buffer = new char[255];
  28. int length = 0;
  29. int c;
  30. @Override
  31. public boolean incrementToken() throws IOException {
  32. //进行分析处理逻辑
  33. clearAttributes();
  34. length = 0;
  35. while (true){
  36. c = this.input.read();
  37. if(c == -1){
  38. if(length > 0){
  39. this.attribute.setChar(buffer,length);
  40. return true;
  41. }else {
  42. return false;
  43. }
  44. }
  45. if(Character.isWhitespace(c)){
  46. if(length > 0){
  47. this.attribute.setChar(buffer,length);
  48. return true;
  49. }
  50. }
  51. buffer[length++] = (char)c;
  52. }
  53. }
  54. }
  55. public static class MyLowerCaseTokenFilter extends TokenFilter{
  56. public MyLowerCaseTokenFilter(TokenStream s){
  57. super(s);
  58. }
  59. MyAttribute attribute = this.addAttribute(MyAttribute.class);
  60. @Override
  61. public boolean incrementToken() throws IOException {
  62. //获取一个分词项进行处理
  63. boolean b = this.input.incrementToken();
  64. if (b){
  65. char[] chars = this.attribute.getChar();
  66. int length = this.attribute.getLength();
  67. if(length > 0){
  68. for (int i = 0; i < length; i++) {
  69. chars[i] = Character.toLowerCase(chars[i]);
  70. }
  71. }
  72. }
  73. return b;
  74. }
  75. }
  76. /**
  77. * 自定义Attribute属性接口 继承Attribute
  78. */
  79. public static interface MyAttribute extends Attribute {
  80. void setChar(char [] c, int length);
  81. char [] getChar();
  82. int getLength();
  83. String getString();
  84. }
  85. /**
  86. * 必须使用interface+Impl 继承AttributeImpl
  87. */
  88. public static class MyAttributeImpl extends AttributeImpl implements MyAttribute {
  89. char [] term = new char[255];
  90. int length = 0;
  91. @Override
  92. public void setChar(char[] c, int length) {
  93. this.length = length;
  94. if(c.length > 0){
  95. System.arraycopy(c,0,term,0,length);
  96. }
  97. }
  98. @Override
  99. public char[] getChar() {
  100. return term;
  101. }
  102. @Override
  103. public int getLength() {
  104. return length;
  105. }
  106. @Override
  107. public String getString() {
  108. if(length > 0){
  109. return new String(term,0,length);
  110. }
  111. return null;
  112. // return new String(term); //不能直接返回 因为长度问题 默认255字符
  113. }
  114. @Override
  115. public void clear() {
  116. term = null;
  117. term = new char[255];
  118. this.length = 0;
  119. }
  120. @Override
  121. public void reflectWith(AttributeReflector reflector) {
  122. }
  123. @Override
  124. public void copyTo(AttributeImpl target) {
  125. }
  126. }
  127. public static void main(String[] args) {
  128. String text = "Hello World A b C";
  129. try(SansamAnalyzer analyzer = new SansamAnalyzer();
  130. //调用tokenStream()时 会先得到TokenStreamComponents对象 得到了MyLowerCaseTokenFilter 对象 观察其构造方法及此方法的返回值
  131. TokenStream stream = analyzer.tokenStream("title",text);){
  132. MyAttribute attribute = stream.getAttribute(MyAttribute.class);
  133. stream.reset();
  134. while (stream.incrementToken()){
  135. System.out.print(attribute.getString()+" | ");
  136. }
  137. stream.end();
  138. }catch (Exception e){
  139. e.printStackTrace();
  140. }
  141. }
  142. }

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. MYSQL临时表使用方法

    当工作在非常大的表上时,你可能偶尔需要运行很多查询获得一个大量数据的小的子集,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表可能更快些,然后在这些表运行查询. ...

  2. sqlserver2008R2 全日志恢复 实例操作

    --创建数据库create database test;--将数据库日志备份模式设置为全日志ALTER DATABASE test SET RECOVERY FULL ; --查询.确认数据库日志备份 ...

  3. python之路:变量与变量基本操作(老王版)

    python开发之路:变量与变量基本操作 你是一个师范大学的优秀毕业生,现在在某某小学工作. 你想:判作业真的很累,隔壁老王现在天天玩<蓝月传奇>,银行里存满了钱.唉,每节课1个小时,每个 ...

  4. Image Storage

  5. Tomcat 启动时 SecureRandom 非常慢解决办法,亲测有效

    1.找到jre—>lib—>security 2.找到      securerandom.source=file:/dev/random 替换成:securerandom.source= ...

  6. JSON Web Token(缩写 JWT) 目前最流行的跨域认证解决方案

    一.跨域认证的问题 互联网服务离不开用户认证.一般流程是下面这样. 1.用户向服务器发送用户名和密码. 2.服务器验证通过后,在当前对话(session)里面保存相关数据,比如用户角色.登录时间等等. ...

  7. 解决matplotlib中文显示

    网上搜的很多方法都不是很好用,这里找到了一个比较好用的办法. 首先将win上的中文字体复制到linux目录下面,我这里使用的是simhei.ttf.然后参考如下代码的使用方式: import matp ...

  8. 我在Python学习中遇到的问题一

    开发工具:PyCharm 系统:macOs Serria 10.12.4 jetbrains出品,作为和idea一个公司的兄弟产品,延续了idea的易用性,并且操作按钮也基本一致 一. 执行环境问题 ...

  9. Ubuntu 16.04 安装OpenCV 3.4.3

    cmake过程中可能遇到的问题:1.如果网络不好,出现ippicv_linux_20151201.tgz无法在终端下载的情况,则可以先单独下载 ippicv_linux_20151201.tgz之后, ...

  10. Codeforces Round #552 (Div. 3) F题

    题目网址:http://codeforces.com/contest/1154/problem/F 题目大意:给出n,m,k,n是物体的个数,m是优惠方式的种数,k是需要购买的物体个数, 然后给出n个 ...