- 浏览: 160151 次
- 性别:
- 来自: 北京
最新评论
-
w156445045:
我最近想写这方面的论文,学位论文啊,哎。希望博主能给点思路,谢 ...
《Lucene+Nutch搜索引擎》看过以后。。。 -
inprice:
这也要研究啊!!!!! 失望ing.........
完成了对于heritrix的初步研究 -
dt_fb:
您好,我想问问您,你有跳过recrawl.sh这个脚本文件么? ...
Nutch开源搜索引擎的crawl日志分析及工作目录说明 -
lovepoem:
能增量吗?是不是还是把所有的url遍历出来。和以前的对比。算是 ...
Nutch开源搜索引擎增量索引recrawl的终极解决办法 -
itang:
见到牛人照片了, MS下巴动过刀(开玩笑)
搜索引擎名人堂之Jeff Dean
Analysis 包分析
算法和数据结构分析 :
由于 Analysis 包比较简单 , 不详述了 !
算法 : 基于机械分词 1-gram,2-gram,HMM( 如果使用 ICTCLAS 接口的话 )
数据结构 : 部分源码用到了 Set ,HashTable,HashMap
认真理解 Token
Lucene 中的 Analysis 包专门用于完成对于索引文件的分词 .Lucene 中的 Token 是一个非常重要的概念 .
看一下其源码实现:
public final class Token {
String termText; // the text of the term
int startOffset; // start in source text
int endOffset; // end in source text
String type = "word"; // lexical type
private int positionIncrement = 1;
public Token(String text, int start, int end)
public Token(String text, int start, int end, String typ)
public void setPositionIncrement(int positionIncrement)
public int getPositionIncrement() { return positionIncrement; }
public final String termText() { return termText; }
public final int startOffset() { return startOffset; }
public void setStartOffset(int givenStartOffset)
public final int endOffset() { return endOffset; }
public void setEndOffset(int givenEndOffset)
public final String type() { return type; }
public String toString()
}
下面编一段代码来看一下
TestToken.java
package org.apache.lucene.analysis.test;
import org.apache.lucene.analysis.*;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import java.io.*;
public class TestToken
{
public static void main(String[] args)
{
String string = new String(" 我爱天大 , 但我更爱中国 ");
//Analyzer analyzer = new StandardAnalyzer();
Analyzer analyzer = new TjuChineseAnalyzer();
//Analyzer analyzer= new StopAnalyzer();
TokenStream ts = analyzer.tokenStream("dummy",new StringReader(string));
Token token;
try
{
int n=0;
while ( (token = ts.next()) != null)
{
System.out.println((n++)+"->"+token.toString());
}
}
catch(IOException ioe)
{
ioe.printStackTrace();
}
}
} 注意看其结果如下所示
0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 我 ,0,1,<CJK>,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 爱 ,1,2,<CJK>,1)
2->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 天 ,2,3,<CJK>,1)
3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 大 ,3,4,<CJK>,1)
4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 但 ,5,6,<CJK>,1)
5->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 我 ,6,7,<CJK>,1)
6->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 更 ,7,8,<CJK>,1)
7->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 爱 ,8,9,<CJK>,1)
8->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 中 ,9,10,<CJK>,1)
9->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 国 ,10,11,<CJK>,1)
注意 : 其中 ”,” 被 StandardAnalyzer 给过滤掉了 , 所以大家注意第 4 个 Token 直接 startOffset 从 5 开始 .
如果改用 StopAnalyzer()
0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 我爱天大 ,0,4,word,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 但我更爱中国 ,5,11,word,1)
改用 TjuChineseAnalyzer( 我写的 , 下文会讲到如何去写 )
0->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 爱 ,3,4,word,1)
1->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 天大 ,6,8,word,1)
2->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 更 ,19,20,word,1)
3->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 爱 ,22,23,word,1)
4->Token's (termText,startOffset,endOffset,type,positionIncrement) is:( 中国 ,25,27,word,1)
讲明白了 Token, 咱们来看以下其他的东西
一个 TokenStream 是用来走访 Token 的 iterator( 迭代器 )
看一下其源代码 :
public abstract class TokenStream {
public abstract Token next() throws IOException;
public void close() throws IOException {}
}
一个 Tokenizer , is-a TokenStream (派生自 TokenStream ),其输入为 Reader
看一下其源码如下:
public abstract class Tokenizer extends TokenStream {
protected Reader input;
protected Tokenizer() {}
protected Tokenizer(Reader input) {
this.input = input;
}
public void close() throws IOException {
input.close();
}
}
一个 TokenFilter is–a TokenStream( 派生自 TokenStream) ,其义如名就是用来完成对 TokenStream 的过滤操作,譬如
去 StopWords ,将 Token 变为小写等。
源码如下:
public abstract class TokenFilter extends TokenStream {
protected TokenStream input;
protected TokenFilter() {}
protected TokenFilter(TokenStream input) {
this.input = input;
}
public void close() throws IOException {
input.close();
}
}
一个 Analyzer 就是一个 TokenStream 工厂
看一下其源码就:
public abstract class Analyzer {
public TokenStream tokenStream(String fieldName, Reader reader)
{
return tokenStream(reader);
}
public TokenStream tokenStream(Reader reader)
{
return tokenStream(null, reader);
}
}
好,现在咱们来看一下 Lucene 的 Analysis 包下面的各个类文件都是用来干什么的。按照字典排序。
Analysis 包中的源码详解
Analyzer.java 上文已经讲过。
CharTokenizer.java 此类为简单一个抽象类,用来对基于字符的进行简单分词( tokenizer )
LetterTokenizer.java 两个非字符之间的字符串定义为 token (举例来说英文单词由空白隔开,那个两个空白之间的字符串即被定义为一个 token 。备注:对于绝大多数欧洲语言来说,这个类工作效能很好。当时对于不用空白符分割的亚洲语言 , 效能极差(譬如中日韩)。)
LowerCaseFilter.java is-a TokenFilter 用于将字母小写化
LowerCaseTokenizer is-a Tokenizer 功能上等价于 LetterTokenizer + LowerCaseFilter
PerFieldAnalyzerWrapper 是一个 Analyzer ,因为继承自 Analyzer 当不同的域( Field )需要不同的语言分析器( Analyzer )时,这个 Analyzer 就派上了用场。使用成员函数 addAnalyzer 可以增加一个非缺省的基于某个 Field 的 analyzer 。很少使用。
PorterStemFilter.java 使用词干抽取算法对每一个 token 流进行词干抽取。
PorterStemmer.java 有名的 P-stemming 算法
SimpleAnalyzer.java
StopAnalyzer.java 具有过滤停用词的功能
StopFilter.java StopFilter 为一个 Filter ,主要用于从 token 流中去除 StopWords
Token.java 上面已讲 .
TokenFilter.java 上面已经讲了
Tokenizer.java 上面已经讲了
TokenStream.java 上面已经讲了
WhitespaceAnalyzer.java
WhitespaceTokenizer.java 只是按照 space 区分 Token.
由于 Lucene 的 analyisis 包下的 Standard 包下的 StandardAnalyzer() 功能很强大 , 而且支持 CJK 分词 , 我们简要说一下 .
此包下的文件是有 StandardTokenizer.jj 经过 javac 命令生成的 . 由于是机器自动生成的代码 , 可能可读性很差 , 想了解的话好好看看那个 StandardTokenizer.jj 文件就会比较明了了 .
Lucene 常用的 Analyzer 功能概述 .
WhitespaceAnalyzer: 仅仅是去除空格,对字符没有 lowcase 化 , 不支持中文
SimpleAnalyzer: 功能强于 WhitespaceAnalyzer, 将除去 letter 之外的符号全部过滤掉 , 并且将所有的字符 lowcase 化 , 不支持中文
StopAnalyzer:StopAnalyzer
的功能超越了
SimpleAnalyzer
,在
SimpleAnalyzer
的基础上
增加了去除
StopWords
的功能
,
不支持中文
StandardAnalyzer: 英文的处理能力同于 StopAnalyzer. 支持中文采用的方法为单字切分 .
ChineseAnalyzer: 来自于 Lucene 的 sand box. 性能类似于 StandardAnalyzer, 缺点是不支持中英文混和分词 .
CJKAnalyzer:chedong
写的
CJKAnalyzer
的功能在英文处理上的功能和
StandardAnalyzer
相同
但是在汉语的分词上,不能过滤掉标点符号,即使用二元切分
TjuChineseAnalyzer: 我写的 , 功能最为强大 .TjuChineseAnlyzer 的功能相当强大 , 在中文分词方面由于其调用的为 ICTCLAS 的 java 接口 . 所以其在中文方面性能上同与 ICTCLAS. 其在英文分词上采用了 Lucene 的 StopAnalyzer, 可以去除 stopWords, 而且可以不区分大小写 , 过滤掉各类标点符号 .
各个 Analyzer 的功能已经比较介绍完毕了 , 现在咱们应该学写 Analyzer, 如何 diy 自己的 analyzer 呢 ??
如何 DIY 一个 Analyzer
咱们写一个 Analyzer, 要求有一下功能
(1) 可以处理中文和英文 , 对于中文实现的是单字切分 , 对于英文实现的是以空格切分 .
(2) 对于英文部分要进行小写化 .
(3) 具有过滤功能 , 可以人工设定 StopWords 列表 . 如果不是人工设定 , 系统会给出默认的 StopWords 列表 .
(4) 使用 P-stemming 算法对于英文部分进行词缀处理 .
代码如下 :
public final class DiyAnalyzer
extends Analyzer
{
private Set stopWords;
public static final String[] CHINESE_ENGLISH_STOP_WORDS =
{
"a", "an", "and", "are", "as", "at", "be", "but", "by",
"for", &quo
发表评论
-
Nutch1.0开源搜索引擎与Paoding在eclipse中用plugin方式集成(终极篇)
2009-09-14 13:15 4340本文主要描述的是如何将paoding分词用plugi ... -
Nutch1.0的那些事
2009-09-10 12:37 2202很久没有更新博客了,应该快一年了。现在呢,我把去年 ... -
配置linux服务器之间ssh不用密码访问
2008-11-05 13:55 3914在配置nutch的时候,我 ... -
搜索引擎术语
2008-10-15 15:30 2552最近monner兄共享了一篇 ... -
搜索引擎机器人研究报告
2008-10-13 15:35 1933从该文对googlebot的分析看,googlebot似乎是想 ... -
搜索引擎算法研究
2008-10-13 15:11 21241.引言 万维网WWW(World Wide Web ... -
谁说搜索引擎只关注结果-看我viewzi的72变
2008-10-04 20:15 1841搜索引擎给大家的感觉,就是用起来简单,以google为首,一个 ... -
《Lucene+Nutch搜索引擎》看过以后。。。
2008-10-03 23:42 7642研究搜索引擎技术快一 ... -
微软有趣的人物关系搜索引擎——人立方
2008-10-03 20:00 3975最近,微软亚洲研究院 ... -
Nutch开源搜索引擎增量索引recrawl的终极解决办法(续)
2008-09-28 19:30 3479十一要放假了,先祝广大同学们节日快乐! 在之前的一篇文章中, ... -
Nutch:一个灵活可扩展的开源web搜索引擎
2008-09-28 11:46 2271在网上找到一篇于2004年11月由CommerceNet La ... -
Google公司都是些什么牛人?
2008-09-27 17:31 2080Google公司都是些什么牛人? 1 Vi ... -
搜索引擎名人堂之Doug Cutting
2008-09-27 11:41 2646Doug Cutting是一个开源搜索技术的提倡者和创造者。他 ... -
Nutch开源搜索引擎增量索引recrawl的终极解决办法
2008-09-26 19:12 5181本文重点是介绍Nutch开源搜索引擎如何在Hadoop分布式计 ... -
Nutch开源搜索引擎与Paoding中文分词用plugin方式集成
2008-09-26 15:31 4597本文是我在集成中文分词paoding时积累的经验,单独成一篇文 ... -
关于Hadoop的MapReduce纯技术点文章
2008-09-24 18:10 3522本文重点讲述Hadoop的整 ... -
MapReduce-免费午餐还没有结束?
2008-09-24 09:57 1488Map Reduce - the Free Lunch is ... -
搜索引擎名人堂之Jeff Dean
2008-09-22 15:09 14982最近一直在研究Nutch,所以关注到了搜索引擎界的一些名人,以 ... -
Lucene与搜索引擎技术(Document包详解)
2008-09-22 14:54 1724Document 包分析 理解 ... -
Lucene的查询语法
2008-09-22 14:53 1419原文来自:http://liyu2000.nease.net/ ...
相关推荐
总的来说,Lucene 2.0是Java全职搜索引擎的重要里程碑,它的分词工具包则解决了处理中文文本的关键问题。通过深入理解和熟练运用这些工具,开发者可以构建出高效、精准的信息检索系统,满足各种搜索需求。尽管年代...
**Lucene 搜索引擎详解** Lucene 是一个由 Apache 软件基金会开发的全文搜索引擎库,它在 Apache Jakarta 项目下属于一个重要的开源组件。Lucene 的设计目标是为软件开发者提供一个简单且可扩展的接口,以便在他们...
Lucene是一个高性能、全文本搜索库,广泛应用于各种搜索引擎的开发中。它提供了一套强大的API,用于索引文本数据,并执行复杂的查询操作。在深入理解Lucene的分词与查询机制之前,我们需要了解以下几个核心概念: 1...
Lucene 并不是一个完整的搜索引擎,而是它的核心组件,专注于索引和搜索功能的实现。通过 Lucene,开发者可以将全文搜索功能轻松地集成到他们的应用程序中。 **主要特点:** 1. **高性能**:Lucene 具有高效的数据...
Apache Lucene,作为一个开源全文检索库,被广泛应用于构建高效的搜索引擎。然而,传统的Lucene主要针对纯文本文件进行操作,而现代业务中,如doc、xlsx等办公文档的处理需求日益增加。本文将深入探讨如何使用Lucene...
在信息技术领域,搜索引擎的构建是不可或缺的一部分,而Lucene.NET作为一款高性能、全文检索引擎库,为开发者提供了强大的文本检索能力。在这个专题中,我们将聚焦于“lucene.net.analysis.cn”,这是一个专门针对...
Elasticsearch 是一款功能强大的全文搜索引擎,而 IK Analyzer 是一个在 Lucene 上构建的智能中文分词库。本文将深入探讨如何将 Elasticsearch Analysis IK 插件应用于 Elasticsearch 中,以实现对中文文本的高效、...
对于那些致力于构建搜索引擎或者对信息检索技术感兴趣的朋友来说,了解并掌握Lucene 2.0.0是必不可少的。 一、Lucene概述 Lucene的核心功能在于提供了一套高效、灵活的文本检索框架。它实现了分词、索引、查询解析...
Lucene是一款开源全文搜索引擎库,由Apache软件基金会开发并维护。它为Java开发者提供了强大的文本搜索功能,被广泛应用于各种信息检索系统。本资源包包含了Lucene的核心资源及API,对于学习和使用Lucene进行全文...
《Java全文搜索引擎Lucene 3.0.0源码及库文件详解》 Java全文搜索引擎Lucene是一款开源的、高性能的文本分析和检索库,它为开发者提供了在Java应用程序中实现全文搜索功能的能力。本篇将深入探讨Lucene 3.0.0版本的...
**Lucene 搜索引擎技术详解** Lucene 是一个开源全文搜索引擎库,由 Apache 软件基金会维护。它提供了一个可扩展的、高性能的搜索框架,使得开发者能够快速地在大量数据中实现全文检索功能。Lucene 已经成为了 Java...
总的来说,"lucene中文分词"是Lucene处理中文文本的关键环节,通过引入"je-analysis"这样的分词插件,我们可以构建出适用于各种场景的中文搜索引擎。在实际应用中,需要根据数据特性选择合适的分词策略,并进行适当...
在信息技术领域,搜索引擎的实现是一项关键的技术,而Apache Lucene作为一款开源全文检索库,为开发者提供了强大的文本搜索功能。本文将深入探讨如何编写你的“第一个Lucene程序”,帮助你理解和掌握Lucene的基本...
Lucene是一个高性能、全文本搜索库,由Apache软件基金会开发,被广泛应用于各种搜索引擎的构建。它提供了一个高级的、灵活的、可扩展的接口,使得开发者能够轻松地在应用程序中实现全文检索功能。在深入理解Lucene...
Solr作为一款成熟的企业级搜索引擎,基于强大的Lucene技术,不仅提供了丰富的功能,还具有高度的可扩展性和灵活性。无论是简单的文本检索还是复杂的数据分析,Solr都能够提供高效稳定的解决方案。对于需要构建高性能...
- 内容搜索引擎:网站文章、博客、新闻等内容的全文搜索。 - 数据库辅助搜索:在大型数据库中提供快速的预览搜索。 - 日志分析:对系统日志进行实时搜索和分析。 - 文件检索:在大量文件中查找包含特定关键词的...
Lucene是一个全文搜索引擎库,它提供了核心的搜索功能,而Nutch则是一个基于Lucene的开源网络爬虫项目,用于抓取网页并建立索引。描述中的“LuceneChapter12 光盘使用说明.DOC”可能是指一份包含第12章内容的文档,...
《Lucene in Action》是一本关于Java搜索引擎技术的权威指南,旨在帮助开发者深入了解并掌握Lucene这一强大的开源文本搜索库。本书由Otis Gospodnetic和Erik Hatcher合著,并得到了Lucene项目的创始人Doug Cutting的...