当前位置:文档之家› lucene详细介绍

lucene详细介绍

lucene详细介绍
lucene详细介绍

lucene详细介绍

1 lucene简介

1.1 什么是lucene

Lucene是一个全文搜索框架,而不是应用产品。因此它并不像https://www.doczj.com/doc/729425154.html,或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品。

1.2 lucene能做什么

要回答这个问题,先要了解lucene的本质。实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你你要搜索的关键词出现在哪里。知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了。你可以把站内新闻都索引了,做个资料库;你可以把一个数据库表的若干个字段索引起来,那就不用再担心因为“%like%”

而锁表了;你也可以写个自己的搜索引擎……

1.3 你该不该选择lucene

下面给出一些测试数据,如果你觉得可以接受,那么可以选择。

测试一:250万记录,300M左右文本,生成索引380M左右,800线程下平均处理时间300ms。测试二:37000记录,索引数据库中的两个varchar字段,索引文件2.6M,800线程下平均处理时间1.5m s。

2 lucene的工作方式

lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。

2.1写入流程

源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。将源中需要的信息加入Docum ent的各个Field中,并把需要索引的Field索引起来,把需要存储的Field存储起来。

将索引写入存储器,存储器可以是内存或磁盘。

2.2读出流程

用户提供搜索关键词,经过analyzer处理。

对处理后的关键词搜索索引找出对应的Document。

用户根据需要从找到的Docum ent中提取需要的Field。

3 一些需要知道的概念

lucene用到一些概念,了解它们的含义,有利于下面的讲解。

3.1 analyzer

Analyzer 是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。

分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。

3.2 docum ent

用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Docum ent的形式存储在索引文件中的。用户进行搜索,也是以Docum ent列表的形式返回。

3.3 field

一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Docum ent中存储的。

Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:

还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,

但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

3.4 term

term是搜索的最小单位,它表示文档的一个词语,term由两部分组成:它表示的词语和这个词语所出现的field。

3.5 tocken

tocken是term的一次出现,它包含trem文本和相应的起止偏移,以及一个类型字符串。一句话中可以出现多次相同的词语,它们都用同一个term表示,但是用不同的tocken,每个tocken标记该词语出现的地方。

3.6 segment

添加索引时并不是每个docum ent都马上添加到同一个索引文件,它们首先被写入到不同的小文件,然后再合并成一个大索引文件,这里每个小文件都是一个segment。

4 lucene的结构

lucene包括core和sandbox两部分,其中core是lucene稳定的核心部分,sandbox包含了一些附加功能,例如highlighter、各种分析器。

Lucene core有七个包:analysis,docum ent,index,queryParser,search,store,util。

4.1 analysis

Analysis包含一些内建的分析器,例如按空白字符分词的WhitespaceAnalyzer,添加了stopwrod过滤的StopAnalyzer,最常用的StandardAnalyzer。

4.2 docum ent

Document包含文档的数据结构,例如Docum ent类定义了存储文档的数据结构,Field类定义了Document的一个域。

4.3 index

Index 包含了索引的读写类,例如对索引文件的segment进行写、合并、优化的IndexWriter 类和对索引进行读取和删除操作的IndexReader类,这里要注意的是不要被IndexReader 这个名字误导,以为它是索引文件的读取类,实际上删除索引也是由它完成,IndexWriter只关心如何将索引写入一个个segment,并将它们合并优化;IndexReader则关注索引文件中各个文档的组织形式。

4.4 queryParser

QueryParser 包含了解析查询语句的类,lucene的查询语句和sql语句有点类似,有各种保留字,按照一定的语法可以组成各种查询。Lucene有很多种Query类,它们都继承自Query,执行各种特殊的查询,QueryParser的作用就是解析查询语句,按顺序调用各种Query类查找出结果。

4.5 search

Search包含了从索引中搜索结果的各种类,例如刚才说的各种Query类,包括TermQuery、BooleanQuery等就在这个包里。

4.6 store

Store包含了索引的存储类,例如Directory定义了索引文件的存储结构,FSDirectory为存储在文件中的索引,RAMDirectory为存储在内存中的索引,MmapDirectory为使用内存映射的索引。

4.7 util

Util包含一些公共工具类,例如时间和字符串之间的转换工具。

5 如何建索引

5.1 最简单的能完成索引的代码片断

IndexWriter writer = new IndexWriter(“/data/index/”, new StandardAnalyzer(), true);

Document doc = new Docum ent();

doc.add(new Field("title", "lucene introduc tion", Field.Store.YES,

Field.Index.TOKENIZED));

doc.add(new Field("content", "lucene works well", Field.Store.YES,

Field.Index.TOKENIZED));

writer.optimize();

writer.close();

下面我们分析一下这段代码。

首先我们创建了一个writer,并指定存放索引的目录为“/data/index”,使用的分析器为StandardAnalyzer,第三个参数说明如果已经有索引文件在索引目录下,我们将覆盖它们。然后我们新建一个document。

我们向docum ent添加一个field,名字是“title”,内容是“lucene introduction”,对它进行存储并索引。

再添加一个名字是“content”的field,内容是“lucene works well”,也是存储并索引。

然后我们将这个文档添加到索引中,如果有多个文档,可以重复上面的操作,创建docum ent 并添加。

添加完所有document,我们对索引进行优化,优化主要是将多个segment合并到一个,有利于提高索引速度。

随后将writer关闭,这点很重要。

对,创建索引就这么简单!

当然你可能修改上面的代码获得更具个性化的服务。

5.2 将索引直接写在内存

你需要首先创建一个RAMDirectory,并将其传给writer,代码如下:

Directory dir = new RAMDirectory();

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true); Document doc = new Docum ent();

doc.add(new Field("title", "lucene introduction", Field.Store.YES,

Field.Index.TOKENIZED));

doc.add(new Field("content", "lucene works well", Field.Store.YES,

Field.Index.TOKENIZED));

writer.optimize();

writer.close();

5.3 索引文本文件

如果你想把纯文本文件索引起来,而不想自己将它们读入字符串创建field,你可以用下面的代码创建field:

Field field = new Field("content", new FileReader(file));

这里的file就是该文本文件。该构造函数实际上是读去文件内容,并对其进行索引,但不存储。

6 如何维护索引

索引的维护操作都是由IndexReader类提供。

6.1 如何删除索引

lucene提供了两种从索引中删除document的方法,一种是

void deleteDocum ent(int docNum)

这种方法是根据docum ent在索引中的编号来删除,每个docum ent加进索引后都会有个唯一编号,所以根据编号删除是一种精确删除,但是这个编号是索引的内部结构,一般我们不会知道某个文件的编号到底是几,所以用处不大。另一种是

void deleteDocum ents(Term term)

这种方法实际上是首先根据参数term执行一个搜索操作,然后把搜索到的结果批量删除了。我们可以通过这个方法提供一个严格的查询条件,达到删除指定docum ent的目的。

下面给出一个例子:

Directory dir = FSDirectory.getDirectory(PATH, false);

IndexReader reader = IndexReader.open(dir);

Term term = new Term(field, key);

reader.deleteDocum ents(term);

reader.close();

6.2 如何更新索引

lucene并没有提供专门的索引更新方法,我们需要先将相应的docum ent删除,然后再将新的docum ent加入索引。例如:

Directory dir = FSDirectory.getDirectory(PATH, false);

IndexReader reader = IndexReader.open(dir);

Term term = new Term(“title”, “lucene introduction”);

reader.deleteDocum ents(term);

reader.close();

IndexWriter writer = new IndexWriter(dir, new StandardAnalyzer(), true); Document doc = new Docum ent();

doc.add(new Field("title", "lucene introduction", Field.Store.YES,

Field.Index.TOKENIZED));

doc.add(new Field("content", "lucene is funny", Field.Store.YES,

Field.Index.TOKENIZED));

writer.addDocum ent(doc);

writer.optimize();

writer.close();

7 如何搜索

lucene 的搜索相当强大,它提供了很多辅助查询类,每个类都继承自Query类,各自完成一种特殊的查询,你可以像搭积木一样将它们任意组合使用,完成一些复杂操作;另外lucene还

提供了Sort类对结果进行排序,提供了Filter类对查询条件进行限制。你或许会不自觉地拿它跟SQL语句进行比较:“lucene能执行and、or、order by、where、like …%xx%?操作吗?”回答是:“当然没问题!”

7.1 各种各样的Query

下面我们看看lucene到底允许我们进行哪些查询操作:

7.1.1 TermQuery

首先介绍最基本的查询,如果你想执行一个这样的查询:“在content域中包含…lucene?的docum ent”,那么你可以用TermQuery:

Term t = new Term("content", " lucene";

Query query = new TermQuery(t);

7.1.2 BooleanQuery

如果你想这么查询:“在content域中包含java或perl的docum ent”,那么你可以建立两个Term Query并把它们用BooleanQuery连接起来:

Term Query termQuery1 = new Term Query(new Term("content", "java");

Term Query termQuery 2 = new TermQuery(new Term("content", "perl"); BooleanQuery booleanQuery = new BooleanQuery();

booleanQuery.add(termQuery 1, BooleanClause.Occur.SHOULD); booleanQuery.add(termQuery 2, BooleanClause.Occur.SHOULD);

7.1.3 WildcardQuery

如果你想对某单词进行通配符查询,你可以用WildcardQuery,通配符包括???匹配一个任意字符和?*?匹配零个或多个任意字符,例如你搜索?use*?,你可能找到?useful?或者?useless?:

Query query = new WildcardQuery(new Term("content", "use*");

7.1.4 PhraseQuery

你可能对中日关系比较感兴趣,想查找…中?和…日?挨得比较近(5个字的距离内)的文章,超过这个距离的不予考虑,你可以:

PhraseQuery query = new PhraseQuery();

query.setSlop(5);

query.add(new Term("content ", “中”));

query.add(new Term(“content”, “日”));

那么它可能搜到“中日合作……”、“中方和日方……”,但是搜不到“中国某高层领导说日本欠扁”。

7.1.5 PrefixQuery

如果你想搜以…中?开头的词语,你可以用PrefixQuery:

PrefixQuery query = new PrefixQuery(new Term("content ", "中");

7.1.6 FuzzyQuery

FuzzyQuery用来搜索相似的term,使用Levenshtein算法。假设你想搜索跟…wuzza?相似的词语,你可以:

Query query = new FuzzyQuery(new Term("content", "wuzza");

你可能得到…fuzzy?和…wuzzy?。

7.1.7 RangeQuery

另一个常用的Query是RangeQuery,你也许想搜索时间域从20060101到20060130之间的document,你可以用RangeQuery:

RangeQuery query = new RangeQuery(new Term(“time”, “20060101”), new

Term(“time”, “20060130”), true);

最后的true表示用闭合区间。

7.2 QueryParser

看了这么多Query,你可能会问:“不会让我自己组合各种Query吧,太麻烦了!”当然不会,lucene提供了一种类似于SQL语句的查询语句,我们姑且叫它lucene语句,通过它,你可以把各种查询一句话搞定,lucene会自动把它们查分成小块交给相应Query执行。下面我们对应每种Query演示一下:

Term Query可以用“field:key”方式,例如“content:lucene”。

BooleanQuery中…与?用…+?,…或?用… ?,例如“content:java contenterl”。WildcardQuery仍然用…??和…*?,例如“content:use*”。

PhraseQuery用…~?,例如“content:"中日"~5”。

PrefixQuery用…*?,例如“中*”。

FuzzyQuery用…~?,例如“content: wuzza ~”。

RangeQuery用…[]?或…{}?,前者表示闭区间,后者表示开区间,例如“time:[20060101 TO 20060130]”,注意TO区分大小写。

你可以任意组合query string,完成复杂操作,例如“标题或正文包括lucene,并且时间在20060101到20060130之间的文章”可以表示为:“+ (title:lucene content:lucene)

+t i me:[20060101 TO 20060130]”。代码如下:

Directory dir = FSDirectory.getDirectory(PATH, false);

IndexSearcher is = new IndexSearcher(dir);

QueryParser parser = new QueryParser("content", new StandardAnalyzer()); Query query = parser.parse("+(title:lucene cont ent:lucene) +time:[20060101 TO 20060130]";

Hits hits = is.search(query);

for (int i = 0; i < hits.length(); i++)

{

Document doc = hits.doc(i);

System.out.println(doc.get("title");

is.close();

首先我们创建一个在指定文件目录上的IndexSearcher。

然后创建一个使用StandardAnalyzer作为分析器的QueryParser,它默认搜索的域是content。

接着我们用QueryParser来parse查询字串,生成一个Query。

然后利用这个Query去查找结果,结果以Hits的形式返回。

这个Hits对象包含一个列表,我们挨个把它的内容显示出来。

7.3 Filter

filter 的作用就是限制只查询索引的某个子集,它的作用有点像SQL语句里的where,但又有区别,它不是正规查询的一部分,只是对数据源进行预处理,然后交给查询语句。注意它执行的是预处理,而不是对查询结果进行过滤,所以使用filter的代价是很大的,它可能会使一次查询耗时提高一百倍。

最常用的filter是RangeFilter和QueryFilter。RangeFilter是设定只搜索指定范围内的索引;QueryFilter是在上次查询的结果中搜索。

Filter的使用非常简单,你只需创建一个filter实例,然后把它传给searcher。继续上面的例子,查询“时间在20060101到20060130之间的文章”除了将限制写在query string中,你还可以写在RangeFilter中:

Directory dir = FSDirectory.getDirectory(PATH, false);

IndexSearcher is = new IndexSearcher(dir);

QueryParser parser = new QueryParser("content", new StandardAnalyzer()); Query query = parser.parse("title:lucene content:lucene";

RangeFilter filter = new RangeFilter("time", "20060101", "20060230", true, true); Hits hits = is.search(query, filter);

for (int i = 0; i < hits.length(); i++)

{

Document doc = hits.doc(i);

System.out.println(doc.get("title");

}

is.close();

7.4 Sort

有时你想要一个排好序的结果集,就像SQL语句的“order by”,lucene能做到:通过So rt。Sort sort = new Sort(“tim e”); //相当于SQL的“order by time”

Sort sort = new Sort(“tim e”, true); // 相当于SQL的“order by tim e desc”

下面是一个完整的例子:

Directory dir = FSDirectory.getDirectory(PATH, false);

IndexSearcher is = new IndexSearcher(dir);

QueryParser parser = new QueryParser("content", new StandardAnalyzer()); Query query = parser.parse("title:lucene content:lucene";

RangeFilter filter = new RangeFilter("time", "20060101", "20060230", true, true); Sort sort = new Sort(“tim e”);

Hits hits = is.search(query, filter, sort);

for (int i = 0; i < hits.length(); i++)

{

Document doc = hits.doc(i);

System.out.println(doc.get("title");

}

is.close();

8 分析器

在前面的概念介绍中我们已经知道了分析器的作用,就是把句子按照语义切分成一个个词语。英文切分已经有了很成熟的分析器:StandardAnalyzer,很多情况下StandardAnalyzer是个不错的选择。甚至你会发现StandardAnalyzer也能对中文进行分词。

但是我们的焦点是中文分词,StandardAnalyzer能支持中文分词吗?实践证明是可以的,但是效果并不好,搜索“如果” 会把“牛奶不如果汁好喝”也搜索出来,而且索引文件很大。那么我

们手头上还有什么分析器可以使用呢?core里面没有,我们可以在sandbox里面找到两个:ChineseAnalyzer和CJKAnalyzer。但是它们同样都有分词不准的问题。相比之下用StandardAnalyzer和ChineseAnalyzer建立索引时间差不多,索引文件大小也差不多,CJKAnalyzer表现会差些,索引文件大且耗时比较长。

要解决问题,首先分析一下这三个分析器的分词方式。StandardAnalyzer和ChineseAnalyzer 都是把句子按单个字切分,也就是说“牛奶不如果汁好喝”会被它们切分成“牛奶不如果汁好喝”;而CJKAnalyzer则会切分成“牛奶奶不不如如果果汁汁好好喝”。这也就解释了为什么搜索“果汁”都能匹配这个句子。

以上分词的缺点至少有两个:匹配不准确和索引文件大。我们的目标是将上面的句子分解成“牛奶不如果汁好喝”。这里的关键就是语义识别,我们如何识别“牛奶”是一个词而“奶不”不是词语?我们很自然会想到基于词库的分词法,也就是我们先得到一个词库,里面列举了大部分词语,我们把句子按某种方式切分,当得到的词语与词库中的项匹配时,我们就认为这种切分是正确的。这样切词的过程就转变成匹配的过程,而匹配的方式最简单的有正向最大匹配和逆向最大匹配两种,说白了就是一个从句子开头向后进行匹配,一个从句子末尾向前进行匹配。基于词库的分词词库非常重要,词库的容量直接影响搜索结果,在相同词库的前提下,据说逆向最大匹配优于正向最大匹配。

当然还有别的分词方法,这本身就是一个学科,我这里也没有深入研究。回到具体应用,我们的目标是能找到成熟的、现成的分词工具,避免重新发明车轮。经过网上搜索,用的比较多的是中科院的ICTCLAS和一个不开放源码但是免费的JE-Analysis。ICTCLAS有个问题是它是一个动态链接库,java调用需要本地方法调用,不方便也有安全隐患,而且口碑也确实不大好。JE-Analysis效果还不错,当然也会有分词不准的地方,相比比较方便放心。

9 性能优化

一直到这里,我们还是在讨论怎么样使lucene跑起来,完成指定任务。利用前面说的也确实能完成大部分功能。但是测试表明lucene的性能并不是很好,在大数据量大并发的条件下甚至会有半分钟返回的情况。另外大数据量的数据初始化建立索引也是一个十分耗时的过程。那么如何提高lucene的性能呢?下面从优化创建索引性能和优化搜索性能两方面介绍。

9.1 优化创建索引性能

这方面的优化途径比较有限,IndexWriter提供了一些接口可以控制建立索引的操作,另外我

们可以先将索引写入RAMDirectory,再批量写入FSDirectory,不管怎样,目的都是尽量少的文件IO,因为创建索引的最大瓶颈在于磁盘IO。另外选择一个较好的分析器也能提高一些性能。

9.1.1 通过设置IndexWriter的参数优化索引建立

setMaxBufferedDocs(int m axBufferedDocs)

控制写入一个新的segment前内存中保存的document的数目,设置较大的数目可以加快建索引速度,默认为10。

setMaxMergeDocs(int m axMergeDocs)

控制一个segment中可以保存的最大document数目,值较小有利于追加索引的速度,默认Integer.MAX_VALUE,无需修改。

setMergeFactor(int m ergeFactor)

控制多个segment合并的频率,值较大时建立索引速度较快,默认是10,可以在建立索引时设置为100。

9.1.2 通过RAMDirectory缓写提高性能

我们可以先把索引写入RAMDirectory,达到一定数量时再批量写进FSDirectory,减少磁盘IO次数。

FSDirectory fsDir = FSDirectory.getDirectory("/data/index", true);

RAMDirectory ramDir = new RAMDirectory();

IndexWriter fsWriter = new IndexWriter(fsDir, new StandardAnalyzer(), true); IndexWriter ramWriter = new IndexWriter(ramDir, new StandardAnalyze r(), true); while (there are docum ents to index)

{

... create Docum ent ...

ramWriter.addDocum ent(doc);

if (condition for flushing memory to disk has been m et)

{

fsWriter.addIndexes(new Directory[] { ramDir });

ramWriter.close();

ramWriter = new IndexWriter(ramDir, new StandardAnalyzer(), true);

}

}

9.1.3 选择较好的分析器

这个优化主要是对磁盘空间的优化,可以将索引文件减小将近一半,相同测试数据下由600M 减少到380M。但是对时间并没有什么帮助,甚至会需要更长时间,因为较好的分析器需要匹配词库,会消耗更多cpu,测试数据用StandardAnalyzer耗时133分钟;用MMAnalyzer耗时150分钟。

9.2 优化搜索性能

虽然建立索引的操作非常耗时,但是那毕竟只在最初创建时才需要,平时只是少量的维护操作,更何况这些可以放到一个后台进程处理,并不影响用户搜索。我们创建索引的目的就是给用户搜索,所以搜索的性能才是我们最关心的。下面就来探讨一下如何提高搜索性能。

9.2.1 将索引放入内存

这是一个最直观的想法,因为内存比磁盘快很多。Lucene提供了RAMDirectory可以在内存中容纳索引:

Directory fsDir = FSDirectory.getDirectory(“/data/index/”, false);

Directory ramDir = new RAMDirectory(fsDir);

Searcher searcher = new IndexSearcher(ramDir);

但是实践证明RAMDirectory和FSDirectory速度差不多,当数据量很小时两者都非常快,当数据量较大时(索引文件400M)RAMDirectory甚至比FSDirectory还要慢一点,这确实让人出乎意料。

而且lucene的搜索非常耗内存,即使将400M的索引文件载入内存,在运行一段时间后都会out of m emory,所以个人认为载入内存的作用并不大。

9.2.2 优化时间范围限制

既然载入内存并不能提高效率,一定有其它瓶颈,经过测试发现最大的瓶颈居然是时间范围限制,那么我们可以怎样使时间范围限制的代价最小呢?

当需要搜索指定时间范围内的结果时,可以:

1、用RangeQuery,设置范围,但是RangeQuery的实现实际上是将时间范围内的时间点展开,组成一个个BooleanClause加入到BooleanQuery中查询,因此时间范围不可能设置太大,经测试,范围超过一个月就会抛BooleanQuery.TooManyClauses,可以通过设置BooleanQuery.setMaxClauseCount (int m axClauseCount)扩大,但是扩大也是有限的,并且随着maxClauseCount扩大,占用内存也扩大

2、用RangeFilter代替RangeQuery,经测试速度不会比RangeQuery慢,但是仍然有性能瓶颈,查询的90%以上时间耗费在RangeFilter,研究其源码发现RangeFilter实际上是首先遍历所有索引,生成一个BitSet,标记每个document,在时间范围内的标记为true,不在的标记为false,然后将结果传递给Searcher查找,这是十分耗时的。

3、进一步提高性能,这个又有两个思路:

a、缓存Filter结果。既然RangeFilter的执行是在搜索之前,那么它的输入都是一定的,就是IndexReader,而IndexReader是由Directory决定的,所以可以认为RangeFilter的结果是由范围的上下限决定的,也就是由具体的RangeFilter对象决定,所以我们只要以RangeFilter对象为键,将filter结果BitSet缓存起来即可。lucene API 已经提供了一个CachingWrapperFilter类封装了Filter及其结果,所以具体实施起来我们可以cache CachingWrapperFilter对象,需要注意的是,不要被CachingWrapperFilter的名字及其说明误导,CachingWrapperFilter看起来是有缓存功能,但的缓存是针对同一个filter的,也就是在你用同一个filter过滤不同IndexReader时,它可以帮你缓存不同IndexReader的结果,而我们的需求恰恰相反,我们是用不同filter过滤同一个IndexReader,所以只能把它作为一个封装类。

b、降低时间精度。研究Filter的工作原理可以看出,它每次工作都是遍历整个索引的,所以时间粒度越大,对比越快,搜索时间越短,在不影响功能的情况下,时间精度越低越好,有时甚至牺牲一点精度也值得,当然最好的情况是根本不作时间限制。

下面针对上面的两个思路演示一下优化结果(都采用800线程随机关键词随即时间范围):

第一组,时间精度为秒:

方式直接用RangeFilter 使用cache 不用filter

平均每个线程耗时10s 1s 300m s

第二组,时间精度为天

方式直接用RangeFilter 使用cache 不用filter

平均每个线程耗时900ms 360ms 300ms

由以上数据可以得出结论:

1、尽量降低时间精度,将精度由秒换成天带来的性能提高甚至比使用cache还好,最好不使用filter。

2、在不能降低时间精度的情况下,使用cache能带了10倍左右的性能提高。

9.2.3 使用更好的分析器

这个跟创建索引优化道理差不多,索引文件小了搜索自然会加快。当然这个提高也是有限的。较好的分析器相对于最差的分析器对性能的提升在20%以下。

10 一些经验

10.1关键词区分大小写

or AND TO等关键词是区分大小写的,lucene只认大写的,小写的当做普通单词。

10.2 读写互斥性

同一时刻只能有一个对索引的写操作,在写的同时可以进行搜索

10.3 文件锁

在写索引的过程中强行退出将在t mp目录留下一个lock文件,使以后的写操作无法进行,可以将其手工删除

10.4 时间格式

lucene只支持一种时间格式yyMMddHHmmss,所以你传一个yy-MM-dd HH:mm:ss的时间给lucene它是不会当作时间来处理的

10.5 设置boost

有些时候在搜索时某个字段的权重需要大一些,例如你可能认为标题中出现关键词的文章比正文中出现关键词的文章更有价值,你可以把标题的boost设置的更大,那么搜索结果会优先显示标题中出现关键词的文章(没有使用排序的前题下)。使用方法:

Field. setBoost(float boost);默认值是1.0,也就是说要增加权重的需要设置得比1大。

转自https://www.doczj.com/doc/729425154.html,/jjwwhmm/archive/2008/02/21/181216.ht ml

正好今天系统中有个需求,需要对用户注册的em ail进行like查询,系统数据量3000万左右,直接通过数据库的like查询肯定不行,使用不到索引.于是想到用lucene试试吧.

很简单的代码:

先通过这个方法对数据做索引.

public void testIndex() throws Exception {

IndexWriter writer = new IndexWriter("E:\\tem p\\index", new StandardAnalyzer(), true);

ApplicationContext context = new ClassPathXmlApplicationContext(

new String[]{"testResource/*.xml"});

DataSource ds = (DataSource) context.getBean("dataSource");

String sql = "select m embercode, idcontent from m emberidentity Where Rownum < 1000";

List result = new JdbcTem plate(ds).queryForList(sql);

Iterator it = result.iterator();

while (it.hasNext()) {

ListOrderedMap map = (ListOrderedMap) it.next();

BigDecimal m embercode = (BigDecimal)map.get("membercode".toUpperCase()); String idcontent = (String) map.get("idcontent".toUpperCase());

Field fMembercode = new Field("membercode", membercode.toString(),

Field.Store.YES, Field.Index.TOKENIZED);

Field fIdcontent = new Field("idcontent", idcontent, Field.Store.YES,

Field.Index.TOKENIZED);;

Document d = new Docum ent();

d.add(fMembercode);

d.add(fIdcontent);

writer.addDocum ent(d);

writer.optimize();

}

writer.close();

}

再通过下面的代码测试模糊查询:

public void testQuery() throws Exception {

Query query = new WildcardQuery(new Term("idcontent", "*niao*")); Directory d = FSDirectory.getDirectory("E:\\tem p\\index", false); IndexSearcher searcher = new IndexSearcher(d);

Hits hits = searcher.search(query);

for (int i=0; i

Document doc = hits.doc(i);

System.out.println(doc.get("m embercode"));

}

}

很快就查出来了!得到membercode,然后就可以根据membercode得到会员信息了.主要的问题在于所以会占用很大的磁盘空间.

基于Lucene的语段模糊匹配中文检索系统设计与实现

(责任编辑:陈和榜) 浙江理工大学学报,第26卷,第1期,2009年1月 Journal of Zhejiang Sci 2Tech U niversity Vol.26,No.1,J an.2009 文章编号:167323851(2009)0120109205收稿日期:2008-05-29 作者简介:黄 珏(1982-  ),女,浙江杭州人,助理研究员,主要从事搜索引擎,数字图书馆,软件工程方面的研究。基于Lucene 的语段模糊匹配中文检索系统设计与实现 黄 珏,黄志远 (浙江理工大学科技与艺术学院,杭州311121) 摘 要:为提高图书馆中文信息检索的精确度和有效性,设计了基于L ucene 的语段模糊匹配中文检索系统。其采用了自然语言处理中的词语切分技术,使输入条件可以直接通过自然语言的方式提交,同时针对语段匹配的实际问题情境,设计了一种新的结果有效性判别模型,提高了检索结果相似度的科学性和准确性。经过多次实验结果的统计,搜索结果有效性可提高12%。 关键词:L ucene ;语段;中文检索;有效性判别 中图分类号:TP393 文献标识码:A 0 引 言 信息检索技术在图书馆领域的应用是举足轻重的,然而,当前图书馆用户在检索资料的时候,常常会遇到这样的情况:记得一篇文章或一本书刊中的某段话,却记不清标题、作者、出版社之类的特征信息。凭着对这个语段的记忆,选取某些关键字/词进行查询,又无法快速准确的找到目标答案。个别数字资源自带的搜索引擎具有全文检索功能,允许用户输入一个语段来进行查询,但是查全率和查准率差强人意:要求输入条件与文档内容完全匹配,或者查询结果不能很好地对应用户感兴趣的内容。 首先,基于关键字/词和逻辑表达式的检索方式不能全面地反映用户的需求。由于用户输入的关键字/词之间,往往不存在任何联系,因此检索条件本身无法清晰表达用户的真正含义[1]。 其次,简单的关键字/词匹配,往往输出大量的文档,而真正相关的文本却很少,使得用户耗费很多的时间和精力处理一些不相关的结果。 因此建立一种基于语段模糊匹配的中文检索系统,为用户提供更为细致和有效的帮助是必要的。目前检索系统的开发平台并不多见,本文采用了一个较为实用的检索引擎架构———L ucene ,它结构精巧,功能强大,便于嵌入各种应用。在L ucene 良好的架构之上,本文结合最大正向匹配的中文分词算法,通过对L ucene 评分机制的改进,建立了一个新的文档有效性二次判别模型,设计了一个多维非线性计算函数得到搜索结果的相似度,并对搜索结果按照有效性来进行排序。与现有的图书馆中文检索系统相比,具有以下改进:输入全文中的某个语段(只需基本一致),即可搜索到与之相关的书籍/文章;检索的精度及结果集的有效性较一般检索系统有所提高。 1 基于Lucene 的语段模糊匹配中文检索系统设计 1.1 开放源码的搜索引擎(L ucene ) L ucene 是apache 软件基金会J akarta 项目组的子项目,是一个开放源代码的全文检索引擎工具包,它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构[2],提供了完整的查询引擎和索引引擎,部分

常用的26条学术搜索引擎

常用的26条学术搜索引擎 学术搜索是一项免费服务,可以帮助快速寻找学术资料,如专家评审文献、论文、书籍、预印本、摘要以及技术报告。这里为你介绍26个学术搜索引擎。 1、 Google 学术搜索 虽然还是Beta版,但个人已觉得现在已经是很好很强大了,Google学术搜索滤掉了普通搜索结果中大量的垃圾信息,排列出文章的不同版本以及被其它文章的引用次数。略显不足的是,它搜索出来的结果没有按照权威度(譬如影响因子、引用次数)依次排列,在中国搜索出来的,前几页可能大部分为中文的一些期刊的文章。 2、Scirus学术搜索 Scirus是目前互联网上最全面、综合性最强的科技文献搜索引擎之一,其口号为“for scientific informationonly”。它由Elsevier科学出版社开发,用于搜索期刊和专利,效果很不错!Scirus覆盖的学科范围包括:农业与生物学,天文学,生物科学,化学与化工,计算机科学,地球与行星科学,经济、金融与管理科学,工程、能源与技术,环境科学,语言学,法学,生命科学,材料科学,数学,医学,神经系统科学,药理学,物理学,心理学,社会与行为科学,社会学等。 3、Base学术搜索 BASE是德国比勒费尔德(Bielefeld)大学图书馆开发的一个多学科的学术搜索引擎,提供对全球异构学术资源的集成检索服务。它整合了德国比勒费尔德大学图书馆的图书馆目录和大约160个开放资源(超过200 万个文档)的数据。 4、Vascoda Vascoda是一个交叉学科门户网站的原型,它注重特定主题的聚合,集成了图书馆的收藏、文献数据库和附加的学术内容。 5、Goole 与google比较了一下发现,能搜索到一些google搜索不到的好东东。它界面简洁,功能强大,速度快,YAHOO、网易都采用了它的搜索技术。各位可以一试。 6、A9

中外搜索引擎研究的现状与发展

中外搜索引擎研究的现状与发展 夏旭李健康 (第一军医大学图书馆广州510515) 摘要: 以WWW网络搜索引擎的发展历程为基础,综述了WWW网络搜索引擎的定义、检索机制、检索规则、词表应用、分类研究、比较研究等方面取得的新进展,探讨搜索引擎发展走向与思路。同时就目前中外搜索引擎普遍存在的问题进行分析,希能对国内中文搜索引擎的开发和准确、快速、全面检索WWW网络乃至因特网信息资源有所启示。 关键词:搜索引擎研究进展综述信息资源管理 由于因特网上信息资源内容广泛、时效性强、访问快速、网络交互搜寻、动态更新,而且还提供快速访问网上信息资源的各种搜索引擎(Search Engines),用于快速搜索WWW网络乃至因特上的有用信息,使得通过WWW网络获取网络信息资源成为国内外研究的一大热点。基于网络的搜索引擎的研制与开发应用成为当前网络信息资源开发应用研究领域的热点。英文搜索引擎“GOOGLE”和中文搜索引擎“百度搜索”的推出,拉开了搜索引擎核心技术争夺战的序幕。可以预言,在今后一段相当长的时间里,搜索引擎还将有长足的发展和进步,检索功能将更趋向于集成化和更具亲和力、更显人性化。 1 搜索引擎的定义、检索机制、检索规则和词表应用 1.1 定义 搜索引擎,Search engines,又称搜索机,Web搜索器,是伴随WWW网络出现的检索网上信息资源的新工具。实质上是一种网页网址检索系统,有的提供分类和关键词检索途径,有的仅提供关键词检索途径。它根据检索规则和从其他信息服务器上得到数据并对数据进行加工处理,自动建立索引,并通过检索接口为用户提供信息查询服务,能够自动对WWW资源建立索引或进行主题分类,并通过查询语法为用户返回匹配资源的系统。搜索引擎主要是由Crawler、Spider、Worm、Robot等计算机软件程序自动在因特网上漫游,不断搜集各类新网址及网页,形成数以千万甚至上亿条记录的数据库。它是通过采集标引众多网络站点来提供全局性网络资源控制与检索机制、将全球WWW网络中所有信息资源作一完整的集合、整理和分类、方便用户查找所需信息的网络检索软件。具有检索面广、信息量大、信息更新速度快,特定主题的检索专指性强等特点。 1.1.1 常规搜索引擎和元搜索引擎 自带索引数据库的搜索引擎通常被称为常规搜索引擎或独立搜索引擎,相应地,集多种常规搜索引擎于一体的搜索引擎则称为(多)元搜索引擎。元搜索引擎是国外搜索引擎开发者新设计的一种集成型搜索引擎,与独立搜索引擎的区别在于:它是通过一个统一的用户界面帮助用户在多个独立搜索引擎中选择和利用合适的搜索引擎,甚至是同时利用多个搜索引擎来实现检索操作。元搜索引擎没有自己独立的数据库,却更多地提供统一界面,形成一个由多个搜索引擎构成的具有独立功能的虚拟逻辑体,通过元搜索引擎的功能实现对这个虚拟逻辑体中各搜索引擎数据库的查询等一切操作。由于元搜索引擎预先配置好多个搜索引擎,每条检索指令都自动通过预先配置的搜索引擎执行,免去了用户逐一记忆和单独使用每个搜索引擎的麻烦。主要的元搜索引擎有ALL-IN-ONE、CUSI、Fun City Web Search、HyperNews、Linksearch、Savvysearch、Metacrawler、Best Search、W3Search Engines、WebSearch、Profusion、Mamma、Avenuesearch、Dogpile、Kwikseek、Findspot、Bytesearch、Webferret、Bluesquirrel Webseeker等。Metacrawler (http://www. https://www.doczj.com/doc/729425154.html,)能同时调用6个搜索引擎;Savvysearch (http://www. https://www.doczj.com/doc/729425154.html,)可有选择地调用21个独立的搜索引擎,检索Web、Usenet 新闻组、软件、参考工具、技术报告等信息,每次最多并行检索5个搜索引擎的数据库。Profusion (http://www. https://www.doczj.com/doc/729425154.html,)最多同时调用9个独立的搜索引擎,调用方式有全部调用、系统自动选择最好的3个、系统自动选择最快的3个、用户从中选取任意个搜索引擎。最新出现的桌面型离线式搜索引擎如Webcompass、WebSeeker、WebFerret、Echosearch、Copernic98等也是元搜索引擎。 1.1.2 集中式搜索引擎和分布式搜索引擎

一种基于Lucene的中文全文检索系统

—94— 一种基于Lucene 的中文全文检索系统 苏潭英1,郭宪勇2,金 鑫3 (1. 解放军信息工程大学电子技术学院,郑州 450004;2. 北京飞燕技术公司,北京 100072;3. 解放军通信指挥学院,武汉 430010)摘 要:在开源全文索引引擎Lucene 的基础上,设计了一个中文全文检索系统模型,该模型系统由7个模块组成,索引模块、检索模块是其中的核心部分。论述了模型的整体结构,分析设计了索引及检索模块,通过具体的索引技术和检索技术来提高整个系统的检索效率。该系统增加了加密模块,实现对建立的全文索引进行加密处理,增强了信息的安全性。 关键词:全文检索;Lucene ;倒排索引 Chinese Full-text Retrieval System Based on Lucene SU Tan-ying 1, GUO Xian-yong 2, JIN Xin 3 (1. Institute of Electronic Technology, PLA Information Engineering University, Zhengzhou 450004; 2. Technology Company of Beijing Feiyan, Beijing 100072; 3. Institute of PLA Communication Command, Wuhan 430010) 【Abstract 】This paper proposes a model of Chinese full-text retrieval system based on Lucene which is an open source full-text retrieval engine,and expatiates its frame. This model is composed of seven modules, among which the index module and the search module are the core parts. It designs them concretely, and improves the search efficiency of the full-text retrieval system with index technology and search technology. The system model concludes an encryption module to encrypt the index and increases the system security. 【Key words 】full-text retrieval; Lucene; inverse index 计 算 机 工 程Computer Engineering 第33卷 第23期 Vol.33 No.23 2007年12月 December 2007 ·软件技术与数据库· 文章编号:1000—3428(2007)23—0094—03 文献标识码:A 中图分类号:TP391 1 中文全文检索系统 全文检索技术是一个最普遍的信息查询应用,人们每天在网上使用Google 、百度等搜索引擎查找自己所需的信息,这些搜索引擎的核心技术之一就是全文检索。随着文档处理电子化、无纸化的发展,图书馆、新闻出版、企业甚至个人的电子数据激增,如何建立数据库、管理好自己的数据,是亟待解决的问题,而全文检索是其中一个非常实用的功能。全文检索产品实际上是一个内嵌该项技术的数据库产品[1]。 西文的全文检索已有许多成熟的理论与方法,其中,开放源代码的全文检索引擎Lucene 是Apache 软件基金会Jakarta 项目组的一个子项目,它的目的是为软件开发人员提供一个简单易用的工具包,方便在目标系统中实现全文检索的功能。很多项目使用了Lucene 作为其后台的全文索引引擎,比较著名的有: (1)Jive :Web 论坛系统; (2)Cocoon :基于XML 的Web 发布框架,全文检索部分使用了Lucene ; (3)Eclipse :基于Java 的开放开发平台,帮助部分的全文索引使用了Lucene 。 Lucene 不支持中文,但可以通过扩充它的语言分析器实现对中文的检索。本文在深入学习研究Lucene 的前提下,设计了一个中文的全文检索系统,对其核心的索引模块和检索模块进行了阐释,并添加了加密模块对索引信息加密,增强了系统的安全性。 2 系统的总体结构 本模型总体上采用了Lucene 的架构。Lucene 的体系结构如表1所示,它的源代码程序由7个模块组成。 表1 Lucene 的组成结构 模块名 功能 org.apache.Lucene.search 搜索入口 org.apache.Lucene.index 索引入口 org.apache.Lucene.analysis 语言分析器 org.apache.Lucene.queryParser 查询分析器 org.apache.Lucene.document 存储结构 org.apache.Lucene.store 底层IO/存储结构 org.apache.Lucene.util 一些公用的数据结构 本文通过扩充Lucene 系统来完成中文的全文检索系统,Lucene 包含了大量的抽象类、接口、文档类型等,需要根据具体应用来定义实现,本文对其作了如下扩充修改: (1)按照中文的词法结构来构建相应的语言分析器。Lucene 的语言分析器提供了抽象的接口,因此,语言分析(analyser)是可以定制的。Lucene 缺省提供了2个比较通用的分析器SimpleAnalyser 和StandardAnalyser ,但这2个分析器缺省都不支持中文,因此,要加入对中文语言的切分规则,需要对其进行修改。 (2)按照被索引的文件的格式对不同类型的文档进行解析,进而建立全文索引。例如HTML 文件,通常需要把其中的内容分类加入索引,这就需要从org.apache.lucene.子document 中定义的类Document 继承,定义自己的HTMLDocument 类,然后将之交给org. apache.lucene.index 模块写入索引文件。Lucene 没有规定数据源的格式,只提供 作者简介:苏潭英(1981-),女,硕士研究生,主研方向:数据库全文检索;郭宪勇,高级工程师;金 鑫,硕士研究生 收稿日期:2007-01-10 E-mail :sutanyingwendy@https://www.doczj.com/doc/729425154.html,

lucene 版本变动总结

3.1 1. 性能提升 2. ReusableAnalyzerBase使得跟容易让TokenStreams 可重用 3. 改进分析器的功能,包括对Unicode的支持(Unicode 4)、CharTermAttribute、对象重用等 4. ConstantScoreQuery允许直接封装Query 对象 5. 可通过IndexWriterConfig 对IndexWriter 进行配置 6. IndexWriter.getReader 被IndexReader.open(IndexWriter) 所替换. 7. 废弃了MultiSearcher;ParallelMultiSearcher被直接吸收到IndexReader 类中 8. 在64位的Windows 和Solaris JVMs, MMapDirectory 作为默认的FSDirectory.open 的实现 9. 新的TotalHitCountCollector用来获取索引的命中数 10. ReaderFinishedListener API 用来清除外部缓存 3.2 1、全新的分组模块,位于lucene/contrib/grouping 使得搜索结果可通过单值的索引域进行分组 2、新的IndexUpgrader 工具,用来转换老格式的索引到当前的版本 3、实现一个新的Directory ——NRTCachingDirectory ,用来在内存中缓存一些小的segments,以减少应用对IO的负载过高,更快速的NRT 再次打开的效率 4、新的Collector 实现——CachingCollector,用来收集搜索命中率(文档ID和分值) 5、可使用IndexWriter 新的addDocuments 和updateDocuments 来批量创建和更新文档的索引 6、新的默认索引合并策略——TieredMergePolicy,更高效的合并非连续的segments,详见https://www.doczj.com/doc/729425154.html,/merging 7、修复了NumericField 在加载已存储文档时没正确返回的问题 Deleted terms are now applied during flushing to the newly flushed segment, which is more efficient than having to later initialize a reader for that segment. 3.3 1、固定打开的文件句柄泄漏在很多地方代码。现在MockDirectoryWrapper(在测试框架)跟踪所有打开的文件、包括锁,并且如果测试失败,释放所有这些失败。 2、拼写检查suggest模块现在包括提示/自动完成功能、有三种实现:Jaspell,三元特里和有限状态https://www.doczj.com/doc/729425154.html,/question/554168_155187 3、改进MMapDirectory(现在也是默认的实现通过FSDirectory.open在64位Linux)返回 4、NRTManager简化处理近乎实时搜索与多个搜索线程,允许应用程序来控制索引变化必须是可见的哪个搜索请求。 5、TwoPhaseCommitTool便于执行多资源两阶段提交,其中包括的IndexWriter。 6、默认合并策略,TieredMergePolicy,在默认情况下有一个新方法(套/

当今搜索引擎技术及发展趋势

当今搜索引擎技术及发展趋势 随着互联网的迅猛发展、WEB信息的增加,用户要在信息海洋里查找信息,就象大海捞针一样,搜索引擎技术恰好解决了这一难题(它可以为用户提供信息检索服务)。目前,搜索引擎技术正成为计算机工业界和学术界争相研究、开发的对象。 搜索引擎(Search Engine)是随着WEB信息的迅速增加,从1995年开始逐渐发展起来的技术。据发表在《科学》杂志1999年7月的文章《WEB信息的可访问性》估计,全球目前的网页超过8亿,有效数据超过9T,并且仍以每4个月翻一番的速度增长。用户要在如此浩瀚的信息海洋里寻找信息,必然会“大海捞针”无功而返。搜索引擎正是为了解决这个“迷航”问题而出现的技术。 搜索引擎以一定的策略在互联网中搜集、发现信息,对信息进行理解、提取、组织和处理,并为用户提供检索服务,从而起到信息导航的目的。搜索引擎提供的导航服务已经成为互联网上非常重要的网络服务,搜索引擎站点也被美誉为“网络门户”。搜索引擎技术因而成为计算机工业界和学术界争相研究、开发的对象。 一、分类 按照信息搜集方法和服务提供方式的不同,搜索引擎系统可以分为三大类: 1.目录式搜索引擎:以人工方式或半自动方式搜集信息,由编辑员查看信息之后,人工形成信息摘要,并将信息置于事先确定的分类框架中。信息大多面向网站,提供目录浏览服务和直接检索服务。该类搜索引擎因为加入了人的智能,所以信息准确、导航质量高,缺点是需要人工介入、维护量大、信息量少、信息更新不及时。这类搜索引擎的代表是:Yahoo、LookSmart、Open Directory、Go Guide等。2.机器人搜索引擎:由一个称为蜘蛛(Spider)的机器人程序以某种策略自动地在互联网中搜集和发现信息,由索引器为搜集到的信息建立索引,由检索器根据用户的查询输入检索索引库,并将查询结果返回给用户。服务方式是面向网页的全文检索服务。该类搜索引擎的优点是信息量大、更新及时、毋需人工干预,缺点是返回信息过多,有很多无关信息,用户必须从结果中进行筛选。这类搜索引擎的代表是:AltaVista、Northern Light、Excite、Infoseek、Inktomi、FAST、Lycos、Google;国内代表为:“天网”、悠游、OpenFind等。 3.元搜索引擎:这类搜索引擎没有自己的数据,而是将用户的查询请求同时向多个搜索引擎递交,将返回的结果进行重复排除、重新排序等处理后,作为自己的结果返回给用户。服务方式为面向网页的全文检索。这类搜索引擎的优点是返回结果的信息量更大、更全,缺点是不能够充分使用所使用搜索引擎的功能,用户需要做更多的筛选。 二、性能指标 我们可以将WEB信息的搜索看作一个信息检索问题,即在由WEB网页组成的文档库中检索出与用户查询相关的文档。所以我们可以用衡量传统信息检索系统的性能参数-召回率(Recall)和精度(Pricision)衡量一个搜索引擎的性能。 召回率是检索出的相关文档数和文档库中所有的相关文档数的比率,衡量的是检索系统(搜索引擎)的查全率;精度是检索出的相关文档数与检索出的文档总数的比率,衡量的是检索系统(搜索引擎)的查准率。对于一个检索系统来讲,召回率和精度不可能两全其美:召回率高时,精度低,精度高时,召回率低。所以常常用11种召回率下11种精度的平均值(即11点平均精度)来衡量一个检索系统的精度。对于搜索引擎系统来讲,因为没有一个搜索引擎系统能够搜集到所有的WEB网页,所以召回率很难计算。目前的搜索引擎系统都非常关心精度。 影响一个搜索引擎系统的性能有很多因素,最主要的是信息检索模型,包括文档和查询的表示方法、评价文档和用户查询相关性的匹配策略、查询结果的排序方法和用户进行相关度反馈的机制

如何测试搜索引擎的索引量大小

如何测试搜索引擎的索引量大小(前篇) 背景知识:搜索引擎的质量指标一般包括相关性(Relevance)、时效性(Freshness)、全面性(Comprehensiveness)和可用性(Usability)等四个方面,今天我们要谈的索引量就属于完整性指标的范畴。 首先需要注意的是,对于搜索引擎,网页的索引量和抓取量是不同的概念。搜索引擎的网页抓取数量一般都要远大于索引量,因为抓取的网页中包括很多内容重复或者作弊等质量不高的网页。搜索引擎需要根据算法从抓取的网页当中取其精华,去其糟粕,挑选出有价值的网页进行索引。因此,对用户而言,搜索引擎的索引量大小才更有意义。 其次,无限制增大索引量并不一定能保证搜索质量的提升。一方面,在全面性指标中,除索引量外,还需要考虑到收录网页的质量和不同类型网页的分布。另一方面,搜索引擎的质量指标体系要保证四方面的均衡发展,不是依靠单个指标的突破就可以改善的。目前包括雅虎中国在内的主流中文搜索引擎的网页索引量都在20 亿量级,基本上可以满足用户的日常查询需求。 然而,由于从外部无法直接测算出搜索引擎网页索引量的绝对值大小,很多搜索引擎服务商喜欢对外夸大自己的收录网页数,作为市场噱头。从1998年开始,Krishna Bharat和Andrei Broder就开始研究,如何通过第三方来客观比较不同搜索引擎索引量的大小。8年后,在今年5月份的WWW2006大会上,来自以色列的Ziv Bar-Yossef和Maxim Gurevich由于这方面的出色研究成果夺得了大会唯一的最佳论文奖。他们的研究算出了主流英文搜索引擎的索引量相对大小:雅虎是Google的1.28倍,Google是MSN的1.36倍。他们是如何算出这些数字的呢?下面我们将为搜索引擎爱好者介绍这个算法,以及探讨在中文搜索引擎上是如何应用的。 概述 搜索引擎的索引量或称覆盖率对搜索结果的相关性、时效性和找到率都具有深远的影响。出于市场运作的考虑,各大互联网搜索引擎不时对外公布自己索引的文档数量,然而这些数据往往不同程度地被加入了一些水份,可信度上有一个问号。因此,如何通过搜索引擎的公共接口,也就是通常所说的搜索框,比较客观、准确地测试它的索引量就成为了一个令人关注的问题。 图1 对搜索引擎的索引采样

基于Lucene的网站全文搜索的设计与实现.

科技情报开发与经济 文章编号:1005-6033(2005)15-0242-03 SCI/TECHINFORMATIONDEVELOPMENT&ECONOMY2005年第15卷第15期 收稿日期:2005-06-03 基于Lucene的网站全文搜索的设计与实现 陈庆伟1,刘 军2 (1.山西省网络管理中心,山西太原,030001;2.山西省科技情报研究所,山西太原,030001)摘要:Lucene是一个基于Java技术的开放源代码全文索引引擎工具包,它可以方便 地嵌入到各种应用中实现针对应用的全文索引/检索功能。利用Lucene的API可以比较方便地为一个网站提供全文搜索功能。探讨了如何使用Lucene建造一个通用的Web站点全文搜索工具,并对在构建系统中应注意的若干问题进行了探讨。关键词:全文搜索;Lucene;Java中图分类号:TP393.07文献标识码:A 在构建一个信息类Web站点的时候,站点的全文搜索功能是必备的功能之一。一般站点的信息内容都存储在各种数据库系统中,并使用数据库提供的检索和查询功能构建网站的搜索功能。但随着信息的累‘%keyword%’查询构成的数据检索性能将积,使用数据库中的类似like急剧下降,因此,只使用数据库查询进行全文检索并不是一个好的解决它可以方便方案。Lucene是一个基于Java技术的全文索引引擎工具包,

地嵌入到各种应用中实现针对应用的全文索引/检索功能。例如Lucene可以快速实现一个简单、功能强大的数据全文检索系统。 PDFWord XSLT 格式化 各种输出 Text XML输出 XML格式 XML中间格式 DBLuceneDB 1设计目标 全文检索系统的主要功能就是为信息资料提供全文索引和查询。对 其他 专业格式 图1 接口的实现示意图 于一个以提供信息资料为主要目的网站来说,网站的全文检索系统是必备功能之一。但对于小型的信息网站来说,购置全文检索系统的代价经‘keyword’查询来代替全文检索常是昂贵的。如果只使用数据库的Like

用lucene实现在一个(或者多个)字段中查找多个关键字

用lucene实现在一个(或者多个)字段中查找多个关键字 最近跟着师兄们做个项目,我的任务就是负责做个“全文检索”的小模块。用到了Lucene 的索引,下面的是其中的用Lucene实现在索引的一个字段(比如文章内容字段)进行查找多个关键字的实例代码。 1.Lucene说明 Lucene是非常优秀的成熟的开源的免费的纯java语言的全文索引检索工具包。 Lucene的的强项在“建立索引”和”搜索“,而不是实现具体的”分词“。Lucene支持对生成索引的进行”增,删,改,查“操作,这比自己建立的索引有了很大的进步。 可以使用专门的分词程序进行分词,在分词的结果上用Lucene建立索引。 2.用Lucene实现在一个或者多个字段中的检索 主要是函数:MultiFieldQueryParser.parse(String[] query,String[] field,Occur[] occ,Analyzer analyzer); 1)query:要查找的字符串数组 2)field:要查找的字符串数组对应的字段(当然有可以相同的) 3)occ:表示对应字段的限制。有三种:Occur.MUST(必须有),Occur.MUST_NOT(必须没有),Occur.SHOULD(应该) 4)analyzer:对查询数据的分析器,最好与建立索引时用的分析器一致 3.代码示例 下面这个程序可以实现在一个字段“contents”中查找多个关键字。稍加修改也可以在多个字段查找多个关键字。 import org.apache.lucene.analysis.standard.StandardAnalyzer; import org.apache.lucene.document.Document; import org.apache.lucene.document.Field; import org.apache.lucene.index.IndexWriter; import org.apache.lucene.queryParser.MultiFieldQueryParser; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.Hits; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.Query;

六大搜索引擎的比较

一、界面、广告以及速度搜索引擎在我们日常操作中的使用频率非常高,大家使用它的目的都非常明确,就是用它来搜寻需要的内容,而不会为搜索引擎的页面做过多的停留,因此搜索引擎的界面设计和速度就对我们的使用产生不小的影响,下面来看看这六款搜索引擎在界面和速度上的表现。谷歌、百度和微软的Live Search,这三大搜索引擎的界面大家都已经相当熟悉,它们有着共同的特点,就是简洁至极:网站LOGO、搜索框和按钮以及个别功能服务链接,除此以外,页面上就没有其他多余和花哨的东西了,给人的感觉非常清爽,界面一目了然,特别是Live Search在不失简洁的同时还通过一些小脚本和背景图片使得页面整体更加美观。三者使用起来都很方便,并且首页界面上没有任何第三方的广告。搜索结果页面,三者同样是采用简洁的风格,页面左侧排列着搜索结果,百度搜索结果页面右侧有不少广告,谷歌视关键词的不同也可能出现右侧广告。 Live Search的界面十分简洁且美观 百度搜索结果页面右侧的广告与上面三者相比,雅虎全能搜在界面上显得更为活泼、色彩更加多样,并且在首页内容上也更丰富。首页上除了常规的搜索所需组成部分外,雅虎全能搜还加入了天气预报、邮箱登录的显示区域。虽然这些占据了一点点页面,但是它们功能实用且不影响正常使用。雅虎全能搜的搜索主页 搜狗搜索的界面可谓结合了谷歌和Live Search:在布局上

与谷歌类似,而在细节上与Live Search有着异曲同工之妙;而搜索新军——网易有道的界面与谷歌、百度站在同一阵线,风格、版式都十分一致。在搜索结果页面中,搜狗搜索页面左侧有少量广告。总的来说,六款搜索引擎的界面设计都比较合理、美观、大方。雅虎全能搜的界面稍有不同,加入了天气预报和邮箱模块,而其他五款都尽量精简,其中谷歌、百度和有道趋于一致,采用最简的风格,而Live Search和搜狗在首页的一些细节上多加以了一些修饰。此外,值得一提的是一些搜索引擎对于Logo文化的重视,在传统的节日或者一些特殊的纪念日时都会将首页的Logo徽标换成与该日子相关的设计。其中在这方面要数谷歌和百度做得最为出色:无论是三八节、五一节这样的国际节日,或者情人节、万圣节这样的西方舶来物,还是春节、清明、端午等传统的中国农历节日,谷歌和百度都会精心设计相应的节日Logo;此外,谷歌在一些特殊的纪念日,如达芬奇诞辰、地球日之类的纪念日也会推出专门的徽标;而百度近期开始定期在首页推出一个搜索封面人物,以此反映对互联网时代风云人物的价值取向,十分有特色。雅虎和搜狗在节日Logo设计方面也有所表现,在节日时也可经常看到其专门的徽标;网易有道正式版新近推出不久,我们还无法对其在特殊Logo的设计上是否会有所表现作出评价。搜索引擎的特色Logo其实并不仅仅是一个单纯的设计,它还有更多的作用:它承载了一种信息,传达了搜索引擎提供商对于创新、

全文搜索引擎和目录搜索引擎区别

实验一:全文搜索引擎和目录索引引擎的区别是什么? 全文搜索引擎因为依靠软件进行,所以数据库的容量非常庞大,但是,它的查询结果往往不够准确。 分类目录依靠人工收集和整理网站,能够提供更为准确的查询结果,但收集的内容却非常有限。 1搜索引擎属于自动网站检索,而目录索引则完全依赖手工操作。 2搜索引擎收录网站时,只要网站本身没有违反有关的规则,一般都能登录成功;而目录索引对网站的要求则高得多,有时即使登录多次也不一定成功。 3当用于在登录搜索引擎时,我们一般不用考虑网站的分类问题,而登录目录索引时则必须将网站放在一个最合适的目录(Directory)。 4搜索引擎中各网站的有关信息都是从用户网页中自动提取的,所以用户的角度看,我们拥有更多的自主权;而目录索引则要求必须手工另外填写网站信息,而且还有各种各样的限制。因此,分类目录型搜索引擎营销方法与技术性搜索引擎的方式有很大的不同,需要充分了解这种区别,才能充分发挥各种不同搜索引擎的作用。 实验二:百度的广告策略如何策划的。谈谈你的看法。 百度的广告策略主要是通过搜索推广、网盟推广、增值服务(百度指数、百度统计、百度推广助手、百度商桥)、其他推广服务(百度图片推广、百度品牌专区、百度火爆地带)、专业客户服务等几项来进行的。 百度推广流程是: 1. 搜索:网民在百度搜索自己关注的关键词信息 2. 推广:企业的推广信息展现在关键词对应的搜索结果页 3. 点击:用户点击推广信息进入企业网站 4. 成交:通过沟通了解,双方达成交易 百度将互联网众多内容网站整合,建立了国内最具实力的联盟体系;百度联盟囊括了24个行业类别的优质网站,加盟合作网站累计超过30万家,影响力覆盖95%以上的中国网民。 百度品牌专区是在网页搜索结果最上方为著名品牌量身定制的资讯发布平台,是为提升网民搜索体验而整合文字、图片、视频等多种展现结果的创新搜索模式。 百度火爆地带是一种针对特定关键词的网络推广方式,按时间段固定付费,出现在百度网页搜索结果第一页的右侧,不同位置价格不同。 百度图片推广是一种针对特定关键词的网络推广方式,按时间段固定付费,出现在百度图片搜索结果第一页的结果区域,不同词汇价格不同。企业购买了图片推广关键词后,就会被主动查找这些关键词的用户找到并向其展示企业推广图片,给企业带来商业机会! 实验三:各个搜索引擎对同类网站的收录情况是否相同?如果不相同,各个搜索引擎有什么特点? 各个搜索引擎对同类网站的收录情况不尽相同。百度与谷歌属于全文引擎搜索,其网页数据库的更新速度也不相同,但收录网页数与更新的速度是谷歌比百度更快,内容更丰富。而雅

lucene基础学习

搜索引擎Lucene 第一章Lucene简介 Lucene是apache软件基金会jakarta项目组的一个子项目,是一个开放源代码[的全文检索引擎工具包,即它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,部分文本分析引擎(英文与德文两种西方语言)。Lucene的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。 第二章lucene索引的建立 的五个基础类 索引的建立,Lucene 提供了五个基础类,分别是Document, Field, IndexWriter, Analyzer, Directory。以下是他们的用途: Document Document的含义为文档,在Lucene中,它代表一种逻辑文件。Lucene本身无法对物理文件建立索引,而只能识别并处理Document的类型文件。Lucene从Document取出相关的数据源并根据属性配置进行相应的处理。 Field 对象是用来描述一个文档的某个属性的 lucene中的field也具有一些特定的类型如

在中,Field内部包含两个静态的内部类分别是Store和Index详细的描述了Field的属性,它们分别表示Field的储存方式和索引方式。 Store类有3个公有的静态属性: :表示该Field不需要储存。 :表示该Field需要储存。 :表示使用压缩方式来保存这个Field的值。 Index有4个公有的静态属性: :表示该Field不需要索引,也就是用户不需要去查找该Field的值。 :表示该Field先被分词再被索引。 TOKENIZED:表示不对该Field进行分词,但是要对他进行索引,也就是该Field会被用户查找。 :表示对该Field进行索引,但是不使用Analyzer,同时禁止它参加评分,主要是为了减少内存的消耗。 Analyzer

搜索引擎

搜索引擎分析 在当今的社会,上网成为了我们大部分人每天必不可少的一部分,网络具有太多的诱惑和开发的潜力,查询资料,消遣娱乐等等,但是这些大部分都离不开搜索引擎技术的应用。今天在我的这篇论文里将会对搜索引擎进行一个分析和相关知识的概括。就如大家所知道的互联网发展早期,以雅虎为代表的网站分类目录查询非常流行。网站分类目录由人工整理维护,精选互联网上的优秀网站,并简要描述,分类放置到不同目录下。用户查询时,通过一层层的点击来查找自己想找的网站。也有人把这种基于目录的检索服务网站称为搜索引擎,但从严格意义上讲,它并不是搜索引擎。1990年,加拿大麦吉尔大学计算机学院的师生开发出Archie。当时,万维网还没有出现,人们通过FTP来共享交流资源。Archie能定期搜集并分析FTP服务器上的文件名信息,提供查找分别在各个FTP主机中的文件。用户必须输入精确的文件名进行搜索,Archie告诉用户哪个FTP服务器能下载该文件。虽然Archie搜集的信息资源不是网页,但和搜索引擎的基本工作方式是一样的:自动搜集信息资源、建立索引、提供检索服务。所以,Archie被公认为现代搜索引擎的鼻祖。 搜索引擎是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。搜索引擎包括全文索

引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。百度和谷歌等是搜索引擎的代表。那么搜索引擎将来的发展方向和发展的前景又是如何?我们就先从以下的各类主流搜索引擎先进行一个大致的分析。 1.全文索引 全文搜索引擎是当今主要网络搜素时所应用的搜索引擎,在网络上也是大家所熟知的,比如google和百度都是我们平时经常使用的。它们从互联网提取各个网站的信息,建立起数据库,并能检索与用户查询条件相匹配的记录,按一定的排列顺序返回结果。根据搜索结果来源的不同,全文搜索引擎可分为两类,一类拥有自己的检索程序,俗称“蜘蛛”程序或“机器人”程序,能自建网页数据库,搜索结果直接从自身的数据库中调用,上面提到的Google 和百度就属于这种类型;另一类则是租用其他搜索引擎的数据库,并按自定的格式排列搜索结果,如Lycos搜索引擎。在搜索引擎分类部分提到过全文搜索引擎从网站提取信息建立网页数据库的概念。搜索引擎的自动信息搜集功能分两种。一种是定期搜索,就是每隔一段时间,搜索引擎就会发启“蜘蛛”程序,对一定IP 地址范围内的互联网站进行检索,一旦发现新的网站,它会自动提取网站的信息和网址加入自己的数据库。而另一种是提交网站搜索,即网站拥有者主动向搜索引擎提交网址,它在一定时间内定向向你的网站派出“蜘蛛”程序,扫描你的网站并将有关信息存入数据库,以备用户查询。由于近年来搜索引擎索引规则发生很

搜索引擎的设计与实现

web搜索引擎的设计与实现

摘要 随着网络的迅猛发展。网络成为信息的极其重要的来源地,越来越多的人从网络上获取自己所需要的信息,这就使得像Google[40],百度[39]这样的通用搜索引擎变成了人们寻找信息必不可少的工具。 本文在深入研究了通用搜索引擎基本原理、架构设计和核心技术的基础上,结合小型搜索引擎的需求,参照了天网,lucene等搜索引擎的原理,构建了一个运行稳定,性能良好而且可扩充的小型搜索引擎系统,本文不仅仅完成了对整个系统的设计,并且完成了所有的编码工作。 本文论述了搜索引擎的开发背景以及搜索引擎的历史和发展趋势,分析了小型搜索引擎的需求,对系统开发中的一些问题,都给出了解决方案,并对方案进行详细设计,编码实现。论文的主要工作及创新如下: 1.在深刻理解网络爬虫的工作原理的基础上,使用数据库的来实现爬虫部分。 2.在深刻理解了中文切词原理的基础之上,对lucene的切词算法上做出了改进的基础上设计了自己的算法,对改进后的算法实现,并进行了准确率和效率的测试,证明在效率上确实提高。 3.在理解了排序索引部分的原理之后,设计了实现索引排序部分结构,完成了详细流程图和编码实现,对完成的代码进行测试。 4.在完成搜索部分设计后,觉得效率上还不能够达到系统的要求,于是为了提高系统的搜索效率,采用了缓存搜索页面和对搜索频率较高词语结果缓存的两级缓存原则来提高系统搜索效率。 关键词:搜索引擎,网络爬虫,中文切词,排序索引

ABSTRACT With the rapidly developing of the network. Network became a vital information source, more and more people are obtaining the information that they need from the network,this making web search engine has become essential tool to people when they want to find some information from internet. In this paper, with in-depth study of the basic principles of general search engines, the design and core technology architecture, combining with the needs of small search engine and in the light of the "tianwang", lucene search engine, I build a stable, good performance and can be expanded small-scale search engine system, this article not only completed the design of the entire system, but also basically completed all the coding work. This article describle not only the background of search engines, but also the history of search engine developing and developing trends,and analyse the needs of small search engines and giving solutionsthe to the problems which was found in the development of the system ,and making a detailed program design, coding to achieve. The main thesis of the article and innovation are as follows: 1.with the deep understanding of the working principle of the network spider.I acheived network spider with using database system. 2.with the deep understanding of Chinese segmentation and segmentation algorithm of lucene system,I made my own segmentation algorithm,and give a lot of tests to my segmentation algorithm to provide that my segmentation algorithm is better. 3.with the deep understanding of sorted and index algorithm,I designed my own sorted and index algorithm with the data-struct I designed and coding it ,it was provided available after lots of tests. 4.after design of search part,I foud the efficiency of the part is not very poor,so I designed two-stage cache device to impove the efficiency of the system. Key words: search engine,net spider, Chinese segmentation,sorted and index

相关主题
文本预览
相关文档 最新文档