Lucene源码阅读 Analyzer分词器

Analyzer:包含两个核心组件,Tokenizer 以及 TokenFilter。

  1. Tokenizer:用于将field字段的内容切割成单个词或token,进行分词处理;
  2. TokenFilter:接收tokenizer分词输出的token流,进行转化过滤处理。
  3. Analyzer:Tokenizer和TokenFilter组成分词器,对输入的文档和输入的查询文本进行处理,得到的结果被存储成为索引字典用来匹配查询输入条件。

Analyzer:针对语言的多样性,市面上提供了多种不同的分析器以适应于不同语言的分词。 英文分词器包括:

  1. WhiteSpaceAnalyzer:仅去除空格,对字符没有lowercase化,不支持中文,也不支持破折号分词。
  2. SimpleAnayzer:功能强于WhiteSpaceAnalyzer,提供对字符的lowercase化,不支持中文,保留停用词。
  3. StopAnalyzer:功能强于SimpleAnayzer,增加了停用词功能,不支持中文。
  4. StandardAnalyzer:英文处理能力增强,保留了email地址及XY&Z的形式,支持中文采用单词分词。 中文分词器包括:
  5. ChineseAnalyzer:一个汉字是一个token。
  6. CJKAnalyzer:两个汉字是一个token。(Lucene自带)
  7. SmartChineseAnalyzer:每一个词语是一个token。

Field Lucene包含多种Field,不同种类的Field在索引、存储、分词方面的策略均有不同。

  1. StringField:字符串类型Field, 不分词, 作为一个整体进行索引(如: 身份证号, 订单编号), 是否需要存储由Store.YES或Store.NO决定
    • new StringField("sField", StringField, Field.Store.YES);
  2. LongField:Long数值型Field代表, 分词并且索引(如: 价格), 是否需要存储由Store.YES或Store.NO决定
    • new LongField("lField", LongField, Field.Store.YES);
  3. StoredField:构建不同类型的Field, 不分词, 不索引, 要存储. (如: 商品图片路径)
    • new StoredField("sField2", StoredField, Field.Store.YES);
  4. TextField:文本类型Field, 分词并且索引, 是否需要存储由Store.YES或Store.NO决定
    • new TextField("tField", TextField, Field.Store.YES);
  5. Field:自定义是否存储、索引、分类、设置权重等
    • FieldType fieldType = new FieldType();// 重构FieldType类
    • fieldType.setIndexed(true);// set 是否索引
    • fieldType.setStored(true);// set 是否存储
    • fieldType.setTokenized(true);// set 是否分词
    • fieldType.setOmitNorms(false);// set 是否可以设置权重
    • Field field = new Field("Field", Field, fieldType);

FIeld特性

  1. 是否分词:根据业务需要来判断是否进行分词,分词的目的是为了索引,如名称、描述等,分词后可以用关键词进行索引;另外有些属性不需要分词,需要精准查询,如身份证号,编号等
  2. 是否索引:需要被用户关键词搜索的都需要建立索引,不需要被索引的可直接存储,不被索引查询
  3. 是否存储:需要给用户返回的信息都需要存储,如不存储则无法返回

TokenStreamComponents:包含Tokenizer、TokenStream和一个TokenFilter,用于对进行传入的Field依据其各项属性进行处理,并返回TokenStream。

TokenStream tok = new StandardFilter(src); tok = new LowerCaseFilter(tok); tok = new StopFilter(tok, stopwords);


版权声明:本文为qq_40334719原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。