【lucene】 field->term的分析过程

1.简述

分析(analysis),在lucene中指的是将域(Field)转换成最基本的索引表示单元——项(Term)的过程。项的值称为语汇单元(token)。

对于英文来说,这个过程历经了提取单词、去除标点、字母转小写、去除停用词、词干还原等。

对应关系见图1-1.

图1-1 field与term的对应关系图示

2.Analyzer

org.apache.lucene.analysis.Analyzer

抽象类。

lucene内置有WhitespaceAnalyzer、SimpleAnalyzer、StopAnalyzer与StandardAnalyzer等分析器。

2.1 StandardAnalyzer简介

org.apache.lucene.analysis.standard.StandardAnalyzer

这是lucene最复杂的核心分析器。它包含大量的逻辑操作来识别某些种类的语汇单元(token),比如公司名称、email地址等。它的主要处理有:提取单词、去除标点、字母转小写、去除停用词。

StandardAnalyzer的createComponents()方法见下:

@Override
protected TokenStreamComponents createComponents(final String fieldName) {
	final StandardTokenizer src = new StandardTokenizer();
	src.setMaxTokenLength(maxTokenLength);
	TokenStream tok = new StandardFilter(src);
	tok = new LowerCaseFilter(tok);
	tok = new StopFilter(tok, stopwords);
	return new TokenStreamComponents(src, tok) {
	  @Override
	  protected void setReader(final Reader reader) {
		src.setMaxTokenLength(StandardAnalyzer.this.maxTokenLength);
		super.setReader(reader);
	  }
	};
}

可以清晰的看到分析过程就是reader->tokenizer->tokenfilter_0->...->tokenfilter_n->tokens.

2.2 指定分析器

在创建IndexWriter时,会指定默认的分析器。也可以在addDocument()与updateDocument()的时候单独为某个文档指定特殊的分析器。

2.3 索引与查询两个阶段的分析器使用

QueryParser通过解析用户输入的lucene查询语法来生成Query对象,为用户带来了方便。

2.4 相关方法

org.apache.lucene.analysis.Analyzer
抽象类。分析器,用于从域(field)中构建语汇单元(tokenstream)。
TokenStream org.apache.lucene.analysis.Analyzer.tokenStream(String fieldName, String text)
它会调用createComponents()方法获得TokenStreamComponents实例,然后返回components.getTokenStream()结果。
TokenStream org.apache.lucene.analysis.Analyzer.tokenStream(String fieldName, Reader reader)
tokenStream()的重载方法。

TokenStreamComponents org.apache.lucene.analysis.Analyzer.createComponents(String fieldName)

创建这个analyzer的component。内部会set reader,set tokenizer,set 若干个tokenfilter。

2.4.1 TokenStreamComponents

org.apache.lucene.analysis.Analyzer.TokenStreamComponents
内部静态类。它封装了一个tokenstream的外部组件。它提供了对tokenizer的访问。

org.apache.lucene.analysis.Analyzer.TokenStreamComponents.TokenStreamComponents(Tokenizer source, TokenStream result)

构造函数。
TokenStream org.apache.lucene.analysis.Analyzer.TokenStreamComponents.getTokenStream()
此方法被Analyzer.tokenStream()方法调用。

2.5 自定义Analyzer

继承Analyzer这个抽象类,重写createComponents方法即可。

TokenStreamComponents org.apache.lucene.analysis.Analyzer.createComponents(String fieldName)

抽象方法,要求子类重写。

一个filter链中,不能随意调整tokenFilter的顺序。例如StopFilter对停用词是区分大小写的,那么将它置于LowerCaseFilter的前面与后面结果是不一样的。
在指定filter顺序时,还要考虑对程序性能的影响。例如我们要考虑这样一个分析器,它既能移除停用词,又能将同义词注入到语汇单元流中。此时,首先移除停用词效果会高一点,避免不必要的计算。

2.6 测试Analyzer

在索引过程中,是看不到field在背后被怎样分析的,我们可以在测试方法中直接new Analyzer对象来测试文本的分析效果。

示例工程:https://code.csdn.net/chuchus/lucenedemo/

3.TokenStream

org.apache.lucene.analysis.TokenStream
抽象类,具体的子类有Tokenizer与TokenFilter。
boolean org.apache.lucene.analysis.TokenStream.incrementToken()
移动游标,得到下一个token,如果tokenstream消费完了返回false。类似JDBC的ResultSet.hasNext()。
void org.apache.lucene.analysis.TokenStream.reset()
在开始调用incrementToken()方法前要先调用此方法。

3.1 TokenNizer

org.apache.lucene.analysis.Tokenizer

抽象类。TokenStream的子类,输入为reader对象。

void org.apache.lucene.analysis.Tokenizer.setReader(Reader input)
设置Tokenizer的reader。

3.2 TokenFilter

org.apache.lucene.analysis.TokenFilter

抽象类,TokenStream的子类,输入为其他的tokenstream对象,可用于迭代链式过滤。常见的子类有LowerCaseFilter,StopFilter等。

org.apache.lucene.analysis.TokenFilter.TokenFilter(TokenStream input)

构造函数,由子类通过super()方式调用,传入Tokenizer对象或tokenFilter对象。

org.apache.lucene.analysis.core.LowerCaseFilter
将token中的字母转为小写。
org.apache.lucene.analysis.core.StopFilter
移除停用词。

org.apache.lucene.analysis.en.PorterStemFilter

基于波特算法的词干过滤器。StandardAnalyzer没有用它,但我们自己可以方便地写一个Analyzer来用它。

3.3 TokenAttribute

TokenStream在得到token(语汇单元)的时候,并不会创建string来保存token,而是通过维护token在stream中的偏移位置来实现。

3.3.1 CharTermAttribute

org.apache.lucene.analysis.tokenattributes.CharTermAttribute
接口。代表token的text属性。
org.apache.lucene.analysis.tokenattributes.CharTermAttributeImpl
CharTermAttribute接口的实现类。
String org.apache.lucene.analysis.tokenattributes.CharTermAttributeImpl.toString()
输出代表token的text。

3.3.2 OffsetAttribute

org.apache.lucene.analysis.tokenattributes.OffsetAttribute
接口。描述一个token在stream中的偏移位置(起始字符与终止字符)。

时间: 2024-09-08 20:17:24

【lucene】 field->term的分析过程的相关文章

Coad和Yourdon面向对象的分析过程

Coad和Yourdon的方法是建立在信息模型化技术.面向对象的程序设计和知识库系统的基础之上的,方法分为面向对象的分析(OOA)和面向对象的设计(OOD).我们在这里先讨论Coad和Yourdon面向对象的分析,在下一节中再讨论面向对象的设计. Coad和Yourdon认为面向对象的分析主要应该考虑:一个与特定应用有关的对象,对象与对象在结构和相互作用上的关系.在面向对象的分析中,需要建立分析模型来描述系统的功能. OOA的任务 面向对象的分析需要完成两个任务: ●形式的说明所面对的应用问题,

anasys-C#调用ANSYS,自动运行APDL命令流的分析过程

问题描述 C#调用ANSYS,自动运行APDL命令流的分析过程 C#如何启动ANSYS软加你,并自动运行apdl文件,获取分析的结果? 解决方案 ANSYS支持命令行 ansys90 -b -p ane3fl -i ... E:xxxx.mac -o E:xxxx.out load('-ascii','E:ansysoptzstryzx.txt') 第一行是matlab中数据dd保存为ansys可读的形式 第二行是调用ansys计算(一共三个路径,第一个是ansys程序的,第二三个分别为输入输出

class-不明白以下结果是怎么出来的,请求分析过程。康桑阿米达

问题描述 不明白以下结果是怎么出来的,请求分析过程.康桑阿米达 #include using namespace std; class Base { friend void fun(); public: Base(int data = 0) :b(data) { cout << "Base()" << endl; } ~Base() { cout << "~Base()" << endl; } static void

曹宇钦:大数据BI分析过程驱动商业表现

Forrester Research资深分析师曹宇钦在2012第二届大数据世界论坛上表示,大数据并非全新的技术,可以来自企业内外.产业链甚至社交媒体.大数据的商业智能分析过程驱动商业表现,带来商业价值. 2012第二届大数据世界论坛(BIG DATA World Forum)于7月13日在北京亮马河酒店会议中心隆重开幕.该论坛专为高级IT人员和企业管理人员而设计,覆盖各行业对http://www.aliyun.com/zixun/aggregation/13982.html">大数据存储管

记一次ORACLE的UNDO表空间爆满分析过程

  这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作业是15分钟一次),从告警邮件分析,好像是UNDO表空间突然一下子被耗尽了.   DB Tablespace Allocated Free Used % Free % Used 192.168.xxx.xxx:1521 UNDOTBS1 16384 190.25 16193.75 1.16 99

《FLUENT 14流场分析自学手册》——2.4 FLUENT14.5的功能模块和分析过程

2.4 FLUENT14.5的功能模块和分析过程 FLUENT 14流场分析自学手册2.4.1 FLUENT14.5的功能模块一套基本FLUENT软件包含了2个部分,即Gambit和FLUENT.Gambit的主要功能是几何建模和网格划分,FLUENT的功能是流场的解算及后置处理.此外还有专门针对旋转机械的几何建模及网格划分模块Gambit/Turbo及其他专门用途的功能模块. Geometry Modeling(几何生成模块):GAMBIT中拥有完整的建模手段,可以生成复杂的几何模型.Mesh

Oracle 死锁分析过程详解

Oracle 死锁分析 关于死锁一般3种处理方式 1.事前预测 2.资源分级 3.事后检测释放 我知道的ORACLE MYSQL都是采用第三种在行锁级别上的话. 这里分析一个ORACLE死锁,首先一个死锁肯定会生成一个TRACE文件,这里会记录很多信息如: Deadlock graph: ---------Blocker(s)--------  ---------Waiter(s)--------- Resource Name          process session holds wai

ORACLE 死锁分析过程

ORACLE 死锁分析 关于死锁一般3种处理方式 1.事前预测 2.资源分级 3.事后检测释放 我知道的ORACLE MYSQL都是采用第三种在行锁级别上的话. 这里分析一个ORACLE死锁,首先一个死锁肯定会生成一个TRACE文件,这里会记录很多信息如: Deadlock graph:                        ---------Blocker(s)--------  ---------Waiter(s)--------- Resource Name          pr

一次Linux系统被攻击的分析过程

IT行业发展到现在,安全问题已经变得至关重要,从最近的"棱镜门"事件中,折射出了很多安全问题,信息安全问题已变得刻不容缓,而做为运维人员,就必须了解一些安全运维准则,同时,要保护自己所负责的业务,首先要站在攻击者的角度思考问题,修补任何潜在的威胁和漏洞. 一次Linux被入侵后的分析 下面通过一个案例介绍下当一个服务器被rootkit入侵后的处理思路和处理过程,rootkit 攻击是Linux系统下最常见的攻击手段和攻击方式. 1.受攻击现象 这是一台客户的门户网站服务器,托管在电信机