• lucene中的Token, TokenStream, Tokenizer, Analyzer


    Token: 如果一个字段被token化,这表示它经过了一个可将内容转化为tokens串的分析程序。 Token是建立索引的基本单位,表示每个被编入索引的字符。 在token化的过程中,分析程序会在使用任何转换逻辑(例如去掉 "a” 或 "the" 这类停用词,执行词干搜寻,将无大小写区分的所有文字转换成小写等)的同时,抽取应被编入索引的文本内容。由于和字段相关的内容减少到只剩核心元素,因此,索引作为与某个字段相关的文字内容,它的规模也被缩小了。只有被token化的字段也将被编入索引的情况下才有意义。 对Akamai.com来说,“标题”被token化,所以Lucene不用搜寻如 "a" 或 "the" 这类单词。

    [java] view plaincopy
     
    1. public final class Token {  
    2.   String termText;      // the text of the term  
    3.   int startOffset;      // start in source text  
    4.   int endOffset;        // end in source text  
    5.   String type = "word"// lexical type  
    6.   
    7.   private int positionIncrement = 1;  
    8.   
    9.   public Token(String text, int start, int end)  
    10.   
    11.   public Token(String text, int start, int end, String typ)  
    12.   
    13.   public void setPositionIncrement(int positionIncrement)  
    14.   
    15.   public int getPositionIncrement() { return positionIncrement; }  
    16.   
    17.   public final String termText() { return termText; }  
    18.   
    19.   public final int startOffset() { return startOffset; }  
    20.   
    21.   public void setStartOffset(int givenStartOffset)  
    22.   
    23.   public final int endOffset() { return endOffset; }  
    24.   
    25.   public void setEndOffset(int givenEndOffset)  
    26.   
    27.   public final String type() { return type; }  
    28.   
    29.   public String toString()  
    30.   
    31.  }  

     

    TokenStream是用来走访Token的iterator(迭代器) 

    [java] view plaincopy
     
    1. public abstract class TokenStream {  
    2.   public abstract Token next() throws IOException;  
    3.   public void close() throws IOException {}  
    4. }  

    Tokenizer继承自TokenStream,其输入为Reader

    [java] view plaincopy
     
    1. public abstract class Tokenizer extends TokenStream {  
    2.   protected Reader input;  
    3.   protected Tokenizer() {}  
    4.   protected Tokenizer(Reader input) {  
    5.     this.input = input;  
    6.   }  
    7.   
    8.   public void close() throws IOException {  
    9.     input.close();  
    10.   }  
    11. }  


    TokenFilter继承自TokenStream,其作用是用来完成对TokenStream的过滤操作,譬如 
    去StopWords,将Token变为小写等

    [java] view plaincopy
     
    1. public abstract class TokenFilter extends TokenStream {  
    2.   protected TokenStream input;  
    3.   protected TokenFilter() {}  
    4.   protected TokenFilter(TokenStream input) {  
    5.     this.input = input;  
    6.   }  
    7.   
    8.   public void close() throws IOException {  
    9.     input.close();  
    10.   }  
    11. }  


    Analyzer就是一个TokenStream工厂 

    [java] view plaincopy
     
    1. public abstract class Analyzer {   
    2.   public TokenStream tokenStream(String fieldName, Reader reader){  
    3.       return tokenStream(reader);  
    4.   }  
    5.   
    6.   public TokenStream tokenStream(Reader reader){  
    7.       return tokenStream(null, reader);  
    8.   }  
    9. }  
    Analyzer的作用就是把文本分解为便于Lucene处理的token,好比人体的肠道,负责把食物分解成易于吸收的小块。
     
    Query query = new QueryParser(Version.LUCENE_36,"text",analyzer).parse(nameen.trim());
    这个是lucene内部先对nameen进行分词,比如按空格之内的,然后分词之后的结果任意一个被包含于text字段里面的内容,那么该条记录就被选中
    例如:

    Hybrid safflower (Carthamus tinctorius) oil 

    分词为:

    +(text:hybrid text:safflower text:carthamus text:tinctorius text:oil) -id:246281

  • 相关阅读:
    PDF 补丁丁 0.5.0.2713 发布(替换字库功能修正字符宽度问题)
    PDF 补丁丁 0.5.0.2691 发布(替换字库新增字符映射功能)
    PDF 补丁丁 0.5.0.2657 发布
    安装Windows 10后PDF补丁丁等程序界面变得模糊的解决办法
    《React+Redux前端开发实战》笔记1:不涉及React项目构建的Hello World案例
    React前端有钱途吗?《React+Redux前端开发实战》学起来
    《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程
    为什么使用React Native
    React Native移动开发实战-5-Android平台的调试技巧
    React Native移动开发实战-4-Android平台的适配原理
  • 原文地址:https://www.cnblogs.com/zwb7926/p/3115615.html
Copyright © 2020-2023  润新知