当前位置:文档之家› Lucene

Lucene

Lucene
Lucene

Lucene 教程

Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大,api也很简单。总得来说用Lucene来进行建立和搜索和操作数据库是差不多的(有点像),Document可以看作是数据库的一行记录,Field可以看作是数据库的字段。用lucene实现搜索引擎就像用JDBC实现连接数据库一样简单。

Lucene2.0,它与以前广泛应用和介绍的Lucene 1.4.3并不兼容。Lucene2.0的下载地址是https://www.doczj.com/doc/5815754932.html,/lucene/java/

例子一:

1、在windows系统下的的C盘,建一个名叫s的文件夹,在该文件夹里面随便建三个txt

文件,随便起名啦,就叫"1.txt","2.txt"和"3.txt"啦

其中1.txt的内容如下:

中华人民共和国

全国人民

2006年

而"2.txt"和"3.txt"的内容也可以随便写几写,这里懒写,就复制一个和1.txt文件的内容一样吧

2、下载lucene包,放在classpath路径中

建立索引:

package https://www.doczj.com/doc/5815754932.html,;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import java.io.InputStreamReader;

import java.util.Date;

import org.apache.lucene.analysis.Analyzer;

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;

/**

* author lighter date 2006-8-7

*/

public class TextFileIndexer {

public static void main(String[] args) throws Exception { /*指明要索引文件夹的位置,这里是C盘的S文件夹下*/

File fileDir = new File( " c:\\s " );

/*这里放索引文件的位置*/

File indexDir = new File( " c:\\index " );

Analyzer luceneAnalyzer = new StandardAnalyzer();

IndexWriter indexWriter = new IndexWriter(indexDir, luceneAnalyzer, true );

File[] textFiles = fileDir.listFiles();

long startTime = new Date().getTime();

//增加document到索引去

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

if (textFiles[i].isFile()

&& textFiles[i].getName().endsWith( " .txt " )) {

System.out.println( " File " + textFiles[i].getCanonicalPath()

+ " 正在被索引. " );

String temp = FileReaderAll(textFiles[i].getCanonicalPath(),

" GBK " );

System.out.println(temp);

Document document = new Document();

Field FieldPath = new Field( " path " , textFiles[i].getPath(),

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

Field FieldBody = new Field( " body " , temp, Field.Store.YES, Field.Index.TOKENIZED,

Field.TermVector.WITH_POSITIONS_OFFSETS);

document.add(FieldPath);

document.add(FieldBody);

indexWriter.addDocument(document);

}

}

//optimize()方法是对索引进行优化

indexWriter.optimize();

indexWriter.close();

//测试一下索引的时间

long endTime = new Date().getTime();

System.out

.println( " 这花费了 "

+ (endTime - startTime)

+ " 毫秒来把文档增加到索引里面去! "

+ fileDir.getPath());

}

public static String FileReaderAll(String FileName, String charset) throws IOException {

BufferedReader reader = new BufferedReader( new InputStreamReader( new FileInputStream(FileName), charset));

String line = new String();

String temp = new String();

while ((line = reader.readLine()) != null ) {

temp += line;

}

reader.close();

return temp;

}

}

索引的结果:

File C:\s\ 1 .txt正在被索引.

中华人民共和国全国人民2006年

File C:\s\ 2 .txt正在被索引.

中华人民共和国全国人民2006年

File C:\s\ 3 .txt正在被索引.

中华人民共和国全国人民2006年

这花费了297 毫秒来把文档增加到索引里面去 ! c:\s

3、建立了索引之后,查询啦....

package https://www.doczj.com/doc/5815754932.html,;

import java.io.IOException;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

import org.apache.lucene.queryParser.ParseException;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

public class TestQuery {

public static void main(String[] args) throws IOException, ParseException { Hits hits = null ;

String queryString = " 中华 " ;

Query query = null ;

IndexSearcher searcher = new IndexSearcher( " c:\\index " );

Analyzer analyzer = new StandardAnalyzer();

try {

QueryParser qp = new QueryParser( " body " , analyzer);

query = qp.parse(queryString);

} catch (ParseException e) {

}

if (searcher != null ) {

hits = searcher.search(query);

if (hits.length() > 0 ) {

System.out.println( " 找到: " + hits.length() + " 个结果! " );

}

}

}

}

其运行结果:

找到: 3 个结果 !

Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索

来看一些在lucene中使用的术语,这里并不打算作详细的介绍,只是点一下而已----因为这一个世界有一种好东西,叫搜索。

IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。

Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。

Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。

Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。

Field:字段。

IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;

Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。

QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query 对象。

Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。

上面作了一大堆名词解释,下面就看几个简单的实例吧:

1、简单的的StandardAnalyzer测试例子

package https://www.doczj.com/doc/5815754932.html,;

import java.io.IOException;

import java.io.StringReader;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.Token;

import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.standard.StandardAnalyzer;

public class StandardAnalyzerTest

{

//构造函数,

public StandardAnalyzerTest()

{

}

public static void main(String[] args)

{

//生成一个StandardAnalyzer对象

Analyzer aAnalyzer = new StandardAnalyzer();

//测试字符串

StringReader sr = new StringReader( " lighter javaeye com is the are on " );

//生成TokenStream对象

TokenStream ts = aAnalyzer.tokenStream( " name " , sr);

try {

int i = 0 ;

Token t = ts.next();

while (t != null )

{

//辅助输出时显示行号

i ++ ;

//输出处理后的字符

System.out.println( " 第 " + i + " 行: " + t.termText());

//取得下一个字符

t = ts.next();

}

} catch (IOException e) {

e.printStackTrace();

}

}

}

显示结果:

第1行:lighter

第2行:javaeye

第3行:com

提示一下:

StandardAnalyzer是lucene中内置的"标准分析器",可以做如下功能:

1、对原有句子按照空格进行了分词

2、所有的大写字母都可以能转换为小写的字母

3、可以去掉一些没有用处的单词,例如"is","the","are"等单词,也删除了所有的标点

查看一下结果与"new StringReader("lighter javaeye com is the are on")"作一个比较就清楚明了。

这里不对其API进行解释了,具体见lucene的官方文档。需要注意一点,这里的代码使用的是lucene2的API,与1.43版有一些明显的差别。

2、看另一个实例,简单地建立索引,进行搜索

package https://www.doczj.com/doc/5815754932.html,;

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.QueryParser;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.store.FSDirectory;

public class FSDirectoryTest {

//建立索引的路径

public static final String path = " c:\\index2 " ;

public static void main(String[] args) throws Exception {

Document doc1 = new Document();

doc1.add( new Field( " name " , " lighter javaeye com " ,Field.Store.YES,Field.Index. TOKENIZED));

Document doc2 = new Document();

doc2.add( new Field( " name " , " lighter blog " ,Field.Store.YES,Field.Index.TOKENIZ ED));

IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true ), new St andardAnalyzer(), true );

writer.setMaxFieldLength( 3 );

writer.addDocument(doc1);

writer.setMaxFieldLength( 3 );

writer.addDocument(doc2);

writer.close();

IndexSearcher searcher = new IndexSearcher(path);

Hits hits = null ;

Query query = null ;

QueryParser qp = new QueryParser( " name " , new StandardAnalyzer());

query = qp.parse( " lighter " );

hits = searcher.search(query);

System.out.println( " 查找\ " lighter\ " 共 " + hits.length() + " 个结果 " );

query = qp.parse( " javaeye " );

hits = searcher.search(query);

System.out.println( " 查找\ " javaeye\ " 共 " + hits.length() + " 个结果 " );

}

}

运行结果:

查找 " lighter " 共2个结果

查找 " javaeye " 共1个结果

到现在我们已经可以用lucene建立索引了

下面介绍一下几个功能来完善一下:

1.索引格式

其实索引目录有两种格式,

一种是除配置文件外,每一个Document独立成为一个文件(这种搜索起来会影响速度)。另一种是全部的Document成一个文件,这样属于复合模式就快了。

2.索引文件可放的位置:

索引可以存放在两个地方1.硬盘,2.内存

放在硬盘上可以用FSDirectory(),放在内存的用RAMDirectory()不过一关机就没了

FSDirectory.getDirectory(File file, boolean create)

FSDirectory.getDirectory(String path, boolean create)

两个工厂方法返回目录

New RAMDirectory()就直接可以

再和

IndexWriter(Directory d, Analyzer a, boolean create)

一配合就行了

如:

IndexWrtier indexWriter = new IndexWriter(FSDirectory.getDirectory(“c:\\index”,true ), n ew StandardAnlyazer(), true );

IndexWrtier indexWriter = new IndexWriter( new RAMDirectory(), new StandardAnlyaze r(), true );

3.索引的合并

这个可用

IndexWriter.addIndexes(Directory[] dirs)

将目录加进去

来看个例子:

public void UniteIndex() throws IOException

{

IndexWriter writerDisk = new IndexWriter(FSDirectory.getDirectory( " c:\\indexDis

k " , true ), new StandardAnalyzer(), true );

Document docDisk = new Document();

docDisk.add( new Field( " name " , " 程序员之家 " ,Field.Store.YES,Field.Index.TOKE NIZED));

writerDisk.addDocument(docDisk);

RAMDirectory ramDir = new RAMDirectory();

IndexWriter writerRam = new IndexWriter(ramDir, new StandardAnalyzer(), true ); Document docRam = new Document();

docRam.add( new Field( " name " , " 程序员杂志 " ,Field.Store.YES,Field.Index.TOKE NIZED));

writerRam.addDocument(docRam);

writerRam.close(); //这个方法非常重要,是必须调用的

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

writerDisk.close();

}

public void UniteSearch() throws ParseException, IOException

{

QueryParser queryParser = new QueryParser( " name " , new StandardAnalyzer()); Query query = queryParser.parse( " 程序员 " );

IndexSearcher indexSearcher = new IndexSearcher( " c:\\indexDisk " );

Hits hits = indexSearcher.search(query);

System.out.println( " 找到了 " + hits.length() + " 结果 " );

for ( int i = 0 ;i

{

Document doc = hits.doc(i);

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

}

}

这个例子是将内存中的索引合并到硬盘上来.

注意:合并的时候一定要将被合并的那一方的IndexWriter的close()方法调用。

4.对索引的其它操作:

IndexReader类是用来操作索引的,它有对Document,Field的删除等操作。

下面一部分的内容是:全文的搜索

全文的搜索主要是用:IndexSearcher,Query,Hits,Document(都是Query的子类),有的时候用QueryParser

主要步骤:

1 . new QueryParser(Field字段,new分析器)

2 .Query query = QueryParser.parser(“要查询的字串”);这个地方我们可以用反射api看一下query究竟是什么类型

3 . new IndexSearcher(索引目录).search(query);返回Hits

4 .用Hits.doc(n);可以遍历出Document

5 .用Document可得到Field的具体信息了。

其实1,2两步就是为了弄出个Query 实例,究竟是什么类型的看分析器了。

拿以前的例子来说吧

QueryParser queryParser = new QueryParser( " name " , new StandardAnalyzer());

Query query = queryParser.parse( " 程序员 " );

/*这里返回的就是org.apache.lucene.search.PhraseQuery*/

IndexSearcher indexSearcher = new IndexSearcher( " c:\\indexDisk " );

Hits hits = indexSearcher.search(query);

不管是什么类型,无非返回的就是Query的子类,我们完全可以不用这两步直接new个Query的子类的实例就ok了,不过一般还是用这两步因为它返回的是PhraseQuery这个是非常强大的query子类它可以进行多字搜索用QueryParser可以设置各个关键字之间的关系这个是最常用的了。

IndexSearcher:

其实IndexSearcher它内部自带了一个IndexReader用来读取索引的,IndexSearcher有个close()方法,这个方法不是用来关闭IndexSearche的是用来关闭自带的IndexReader。

QueryParser呢可以用parser.setOperator()来设置各个关键字之间的关系(与还是或)它可以自动通过空格从字串里面将关键字分离出来。

注意:用QueryParser搜索的时候分析器一定的和建立索引时候用的分析器是一样的。Query:

可以看一个lucene2.0的帮助文档有很多的子类:

BooleanQuery, ConstantScoreQuery, ConstantScoreRangeQuery, DisjunctionMaxQuery, FilteredQuery, MatchAllDocsQuery, MultiPhraseQuery, MultiTermQuery, PhraseQuery, PrefixQuery, RangeQuery, SpanQuery, TermQuery

各自有用法看一下文档就能知道它们的用法了

下面一部分讲一下lucene的分析器:

分析器是由分词器和过滤器组成的,拿英文来说吧分词器就是通过空格把单词分开,过滤器就是把the,to,of等词去掉不被搜索和索引。

我们最常用的是StandardAnalyzer()它是lucene的标准分析器它集成了内部的许多的分析器。

最后一部分了:lucene的高级搜索了

1.排序

Lucene有内置的排序用IndexSearcher.search(query,sort)但是功能并不理想。我们需要自己实现自定义的排序。

这样的话得实现两个接口: ScoreDocComparator, SortComparatorSource

用IndexSearcher.search(query,new Sort(new SortField(String

Field,SortComparatorSource)));

就看个例子吧:

这是一个建立索引的例子:

public void IndexSort() throws IOException

{

IndexWriter writer = new IndexWriter( " C:\\indexStore " , new StandardAnalyzer(), t rue );

Document doc = new Document()

doc.add( new Field( " sort " , " 1 " ,Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 4 " ,Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 3 " ,Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 5 " ,Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 9 " ,Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 6 " ,Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

doc = new Document();

doc.add( new Field( " sort " , " 7 " ,Field.Store.YES,Field.Index.TOKENIZED));

writer.addDocument(doc);

writer.close();

}

下面是搜索的例子:

[code]

public void SearchSort1() throws IOException, ParseException

{

IndexSearcher indexSearcher = new IndexSearcher("C:\\indexStore");

QueryParser queryParser = new QueryParser("sort",new StandardAnalyzer());

Query query = queryParser.parse("4");

Hits hits = indexSearcher.search(query);

System.out.println("有"+hits.length()+"个结果");

Document doc = hits.doc(0);

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

}

public void SearchSort2() throws IOException, ParseException

{

IndexSearcher indexSearcher = new IndexSearcher("C:\\indexStore");

Query query = new RangeQuery(new Term("sort","1"),new Term("sort","9"),true);//这个地方前面没有提到,它是用于范围的Query可以看一下帮助文档.

Hits hits = indexSearcher.search(query,new Sort(new SortField("sort",new MySortComparatorSource())));

System.out.println("有"+hits.length()+"个结果");

for(int i=0;i

{

Document doc = hits.doc(i);

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

}

}

public class MyScoreDocComparator implements ScoreDocComparator

{

private Integer[]sort;

public MyScoreDocComparator(String s,IndexReader reader, String fieldname) throws IOException

{

sort = new Integer[reader.maxDoc()];

for(int i = 0;i

{

Document doc =reader.document(i);

sort[i]=new Integer(doc.get("sort"));

}

}

public int compare(ScoreDoc i, ScoreDoc j)

{

if(sort[i.doc]>sort[j.doc])

return 1;

if(sort[i.doc]

return -1;

return 0;

}

public int sortType()

{

return SortField.INT;

}

public Comparable sortValue(ScoreDoc i)

{

// TODO 自动生成方法存根

return new Integer(sort[i.doc]);

}

}

public class MySortComparatorSource implements SortComparatorSource

{

private static final long serialVersionUID = -9189690812107968361L;

public ScoreDocComparator newComparator(IndexReader reader, String fieldname)

throws IOException

{

if(fieldname.equals("sort"))

return new MyScoreDocComparator("sort",reader,fieldname);

return null;

}

}[/code]

SearchSort1()输出的结果没有排序,SearchSort2()就排序了。

2.多域搜索MultiFieldQueryParser

如果想输入关键字而不想关心是在哪个Field里的就可以用MultiFieldQueryParser了

用它的构造函数即可后面的和一个Field一样。

MultiFieldQueryParser. parse(String[] queries, String[] fields, BooleanClause.Occur[] flags, Analyzer analyzer) ~~~~~~~~~~~~~~~~~

第三个参数比较特殊这里也是与以前lucene1.4.3不一样的地方

看一个例子就知道了

String[] fields = {"filename", "contents", "description"};

BooleanClause.Occur[] flags = {BooleanClause.Occur.SHOULD,

BooleanClause.Occur.MUST,//在这个Field里必须出现的

BooleanClause.Occur.MUST_NOT};//在这个Field里不能出现

MultiFieldQueryParser.parse("query", fields, flags, analyzer);

1、lucene的索引不能太大,要不然效率会很低。大于1G的时候就必须考虑分布索引的问题

2、不建议用多线程来建索引,产生的互锁问题很麻烦。经常发现索引被lock,无法重新建立的情况

3、中文分词是个大问题,目前免费的分词效果都很差。如果有能力还是自己实现一个分词模块,用最短路径的切分方法,网上有教材和demo源码,可以参考。

4、建增量索引的时候很耗cpu,在访问量大的时候会导致cpu的idle为0

5、默认的评分机制不太合理,需要根据自己的业务定制

整体来说lucene要用好不容易,必须在上述方面扩充他的功能,才能作为一个商用的搜索引擎

lucene版本对比

一、为什么使用lucene 1、Lucene不是一个完整的全文索引应用,而是是一个用JAVA写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。这样的定位,使得lucene有很高的抽象层次,便于扩展和整合到已有的系统。因为对于大多数的全文搜索应用来说,我们需要的是一个开发工具包而不是最终产品(虽然很多搜索引擎也可以扩展特性功能)。这也是程序员最愿意接受的封装层次。 2、Lucene的API接口设计的比较通用,输入输出结构都很像数据库的表==>记录==>字段,所以很多传统的应用的文件、数据库等都可以比较方便的映射到Lucene的存储结构/接口中。(上面语句有些来自在应用中加入全文检索功能——基于JAVA的全文索引引擎Lucene简介)。 二、lucene4.0新特性较重要部分 1、全部使用字节( utf-8 tytes )替代string来构建 term directory 。 带来的好处是:索引文件读取速度 30 倍的提升;占用原来大约10%的内存;搜索过程由于去掉了字符串的转化速度也会明显提升; 但是如果说这上面的好处只是一个副产品,你会怎么想?没错,Mysql有MyIsam,Innodb等诸多引擎供我们选择的,Lucene为什么不能向这个方向发展呢? 实现这个机制的模块叫:Codec (编码器),你可以实现自己的Codec 来进行自定义的扩展,很显然Codec的操作对象是Segment 。

2、支持多线程建索引,支持:concurrent flushing。 了解过Lucene 3.X的同学们都知道,诸如XXXPerThread 的类在建索引的时候已经支持多线程了,但是当每个线程的内存达到指定上限(maxBufferedDocs or ramMaxBufferSizeMB)的时候就需要写到硬盘上,而这个过程仍然不是多线程的,仍然需要一个个排队Flush到硬盘。Lucene 4.0 终于支持 concurrent flushing 了。DocumentsWriterPerThread ,Lucene 4.0 的Concurrent Flushing 正是这个类来实现的。 3、基于有限自动机的模糊匹配算法(FSA算法),FuzzyQuery FuzzyQuery 这类查询估计大家用的比较少。在英文中单词拼写错误,比如: Lucene, Licene , lucen 等就可以用FuzzyQuery来进行查询提高查全率。 在lucene 4.0 之前的FuzzyQuery 的实现非常耗费cpu,实现算法也很暴力。具体过程是:读取每个term,然后计算每个term与查询词的“编辑距离”,如果在指定的范围内则返回。 Lucene 4.0 使用Levenshtein Automaton 的来衡量文字的"编辑距离" ,使用有限状态自动机来进行计算。以数百倍的效率提升了FuzzyQuery 的效率。 三、lucene4.0正式版亮点功能: 一、通过解码器Codec 机制 Lucene 索引格式与Lucene架构解耦,变成了Plugin方式实现,包括:Terms , Postings lists ,Stored 字段,Term Vectors 等都可以以自定义的格式予以支持。正如Mysql支持多种存储引擎一样,现在Lucene也可以了。

基于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],提供了完整的查询引擎和索引引擎,部分

全文检索功能

在应用中加入全文检索功能 ——基于java的全文索引引擎lucene简介 作者:车东 email: https://www.doczj.com/doc/5815754932.html,/https://www.doczj.com/doc/5815754932.html, 写于:2002/08 最后更新: 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 https://www.doczj.com/doc/5815754932.html,/tech/lucene.html 关键词:lucene java full-text search engine chinese word segment 内容摘要: lucene是一个基于java的全文索引工具包。 1.基于java的全文索引引擎lucene简介:关于作者和lucene的历史 2.全文检索的实现:luene全文索引和数据库索引的比较 3.中文切分词机制简介:基于词库和自动切分词算法的比较 4.具体的安装和使用简介:系统结构介绍和演示 5.hacking lucene:简化的查询分析器,删除的实现,定制的排序,应用接口的扩展 6.从lucene我们还可以学到什么 基于java的全文索引/检索引擎——lucene lucene不是一个完整的全文索引应用,而是是一个用java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 lucene的作者:lucene的贡献者doug cutting是一位资深全文索引/检索专家,曾经是v-twin搜索引擎(apple的copland操作系统的成就之一)的主要开发者,后在excite担任高级系统架构设计师,目前从事于一些internet底层架构的研究。他贡献出的lucene的目标是为各种中小型应用程序加入全文检索功能。 lucene的发展历程:早先发布在作者自己的https://www.doczj.com/doc/5815754932.html,,后来发布在sourceforge,2001年年底成为apache基金会jakarta的一个子项目:https://www.doczj.com/doc/5815754932.html,/lucene/ 已经有很多java项目都使用了lucene作为其后台的全文索引引擎,比较著名的有: ?jive:web论坛系统; ?eyebrows:邮件列表html归档/浏览/查询系统,本文的主要参考文档“thelucene search engine: powerful, flexible, and free”作者就是eyebrows系统的主要开发者之一,而eyebrows已 经成为目前apache项目的主要邮件列表归档系统。 ?cocoon:基于xml的web发布框架,全文检索部分使用了lucene ?eclipse:基于java的开放开发平台,帮助部分的全文索引使用了lucene

Lucene in Action(中文版)

Lucene in Action(中文版) -------------------------------------------------------------------------------- Lucene in Action 中文版 第一部分 Lucene核心 1. 接触Lucene 2. 索引 3. 为程序添加搜索 4. 分析 5. 高极搜索技术 6. 扩展搜索 第二部分 Lucene应用 7. 分析常用文档格式 8. 工具和扩充 9. Lucene其它版本 10. 案例学习 序 Lucene开始是做为私有项目。在1997年末,因为工作不稳定,我寻找自己的一些东西来卖。Java是比较热门的编程语言,我需要一个理由来学习它。我已经了解如何来编写搜索软件,所以我想我可以通过用Java写搜索软件来维持生计。所以我写了Lucene。 几年以后,在2000年,我意识到我没有销售天赋。我对谈判许可和合同没有任何兴趣,并且我也不想雇人开一家公司。我喜欢做软件,而不是出售它。所以我把Lucene放在SourceForge上,看看是不是开源能让我继续我想做的。 有些人马上开始使用Lucene。大约一年后,在2001年,Apache提出要采纳Lucene。Lucene 邮件列表中的消息每天都稳定地增长。也有人开始贡献代码,大多是围绕Lucene的边缘补充:我依然是仅有的理解它的核心的开发者。尽管如些,Lucene开始成为真正的合作项目。现在,2004年,Lucene有一群积极的深刻理解其核心的开发者。我早已不再每天作开发,这个强有力的工作组在进行实质性的增加与改进。 这些年来,Lucene已经翻译成很多其它的语言包括C++、C#、Perl和Python。在最开始的Java和其它这些语言中,Lucene的应用比我预想的要广泛地多。它为不同的应用(如财富100公司讨论组、商业Bug跟踪、Microsoft提供的邮件搜索和100页面范围的Web搜索引擎)提供搜索动力。在业内,我被介绍为“Lucene人”。很多人告诉我他们在项目中使用到Lucene。我依然认为我只听说了使用Lucene的程序的小部分。 如果我当初只是出售它,Lucene应用得不会这么广泛。程序开发人员看来更喜欢开源。他们在有问题时不用联系技术支持而只需查看一下源代码。如果这还不够,邮件列表中的免费支持比大多商业支持要好得多。类似Lucene的开源项目使得程序开发人员更加有效率。Lucene通过开源已经变得比我想象的伟大的多。我见证了它的发展,是Lucene社区的努力

一种基于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/5815754932.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/5815754932.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/5815754932.html,/question/554168_155187 3、改进MMapDirectory(现在也是默认的实现通过FSDirectory.open在64位Linux)返回 4、NRTManager简化处理近乎实时搜索与多个搜索线程,允许应用程序来控制索引变化必须是可见的哪个搜索请求。 5、TwoPhaseCommitTool便于执行多资源两阶段提交,其中包括的IndexWriter。 6、默认合并策略,TieredMergePolicy,在默认情况下有一个新方法(套/

深入理解lucene原理

深入理解lucene原理 一:什么是索引,为什么需要索引 对非结构化数据也即对全文数据的搜索主要有两种方法: 一种是顺序扫描法(Serial Scanning):所谓顺序扫描,比如要找内容包含某一个字符串的文件,就是一个文档一个文档的看,对于每一个文档,从头看到尾,如果此文档包含此字符串,则此文档为我们要找的文件,接着看下一个文件,直到扫描完所有的文件。如利用windows的搜索也可以搜索文件内容,只是相当的慢。如果你有一个80G硬盘,如果想在上面找到一个内容包含某字符串的文件,不花他几个小时,怕是做不到。Linux下的grep命令也是这一种方式。大家可能觉得这种方法比较原始,但对于小数据量的文件,这种方法还是最直接,最方便的。但是对于大量的文件,这种方法就很慢了。 有人可能会说,对非结构化数据顺序扫描很慢,对结构化数据的搜索却相对较快(由于结构化数据有一定的结构可以采取一定的搜索算法加快速度),那么把我们的非结构化数据想办法弄得有一定结构不就行了吗? 这种想法很天然,却构成了全文检索的基本思路,也即将非结构化数据中的一部分信息提取出来,重新组织,使其变得有一定结构,然后对此有一定结构的数据进行搜索,从而达到搜索相对较快的目的。 这部分从非结构化数据中提取出的然后重新组织的信息,我们称之索引 例如:字典,字典的拼音表和部首检字表就相当于字典的索引 二:索引包含哪些东西 其实是由于我们想要搜索的信息和非结构化数据中所存储的信息不一致造成的。

非结构化数据中所存储的信息是每个文件包含哪些字符串,已知文件,欲求字符串相对容易,也即是从文件到字符串的映射。 而我们想搜索的信息是哪些文件包含此字符串,也即已知字符串,欲求文件,也即从字符串到文件的映射。两者恰恰相反。 于是如果索引总能够保存从字符串到文件的映射,则会大大提高搜索速度。 由于从字符串到文件的映射是文件到字符串映射的反向过程,于是保存这种信息的索引称为反向索引。 左边保存的是一系列字符串,称为词典。每个字符串都指向包含此字符串的文档(Document)链表,此文档链表称为倒排表(Posting List)。 三:索引的创建过程 1.全文索引相对于顺序扫描的优势:一次索引,多次使用 2.创建索引的步骤: (1)要索引的原文档 (2)将原文档传给分词组件(Tokenizer) 分词组件会做如下事情:(此过程称为Tokenize) a.将文档分成一个一个的单词 b.去除标点符号 c.去除停词(Stop Word)停词就是语句中无意义的词汇,英语中比如“the”,“a”,“this”等 每一种分词组件(Tokenize)都有一个停词集合 经过分词组件分词后得到的结果称为(词元)Token

搜索引擎论文题目(热门标题100个)

搜索引擎论文题目(热门标题100个) 搜索引擎(Search Engine)是指根据一定的策略、运用特定的计算机程序从互联网上搜集信息,在对信息进行组织和处理后,为用户提供检索服务,将用户检索相关的信息展示给用户的系统。下面是100个关于搜索引擎论文题目,供大家参考。 搜索引擎论文题目一: 1、搜索引擎商标侵权法律问题研究 2、搜索引擎中的伦理失范问题与治理研究 3、中文学术搜索引擎比较研究 4、利用搜索引擎数据模拟疾病空间分布 5、大学生网络信息搜索行为实证研究——基于搜索引擎的利用 6、跨设备搜索引擎结果页面注意力分布研究——基于眼动视觉数据的实证分析 7、基于Lucene的新闻垂直搜索引擎设计与实现 8、基于更新信息的网页机器理解及其在站内搜索引擎中应用 9、利用学术搜索引擎及学术论坛提高大学生研究性学习效率 10、基于大数据的有声图书馆搜索引擎设计 11、基于Redis的分布式搜索引擎研究 12、大数据搜索引擎下的知识产出机制研究

13、“老狐狸”施密特:带领谷歌从搜索引擎变身7000亿美元市值科技巨头 14、基于搜索引擎数据的流感监测预警 15、竞价排名中搜索引擎服务提供商的审查义务范围研究 16、论搜索引擎公司的社会责任 17、电商营销精确搜索引擎的优化设计与实现 18、电子商务专业“学赛创”一体化教学模式的设计与实践——以《搜索引擎优化》课程为例 19、基于Google API的全文搜索引擎系统 20、基于知网与搜索引擎的词汇语义相似度计算 21、国内可视化搜索引擎研究进展:领域应用与系统实现 22、开源搜索引擎Elasticsearch和Solr对比和分析 23、如何免费从搜索引擎获取SEO流量 24、网站SEO中被搜索引擎惩罚的几种表现 25、网络搜索引擎广告的创新传播策略 搜索引擎论文题目二: 26、搜索引擎社会责任缺失的现状、原因及对策研究 27、知识发现系统与通用学术搜索引擎文献资源比较研究——以超星发现和百度学术为例 28、搜索引擎中缩略图使用的合法性分析 29、多边平台的产品市场界定——兼论搜索引擎的产品市场

基于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;

Lucene简介

在应用中加入全文检索功能 ——基于Java的全文索引引擎Lucene简介 作者:车东 Email: https://www.doczj.com/doc/5815754932.html,/https://www.doczj.com/doc/5815754932.html, 写于:2002/08 最后更新:09/09/2006 17:09:05 Feed Back >> (Read this before you ask question) 版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本声明 https://www.doczj.com/doc/5815754932.html,/tech/lucene.html 关键词:Lucene java full-text search engine Chinese word segment 内容摘要: Lucene是一个基于Java的全文索引工具包。 1.基于Java的全文索引引擎Lucene简介:关于作者和Lucene的历史 2.全文检索的实现:Luene全文索引和数据库索引的比较 3.中文切分词机制简介:基于词库和自动切分词算法的比较 4.具体的安装和使用简介:系统结构介绍和演示 5.Hacking Lucene:简化的查询分析器,删除的实现,定制的排序,应用 接口的扩展 6.从Lucene我们还可以学到什么 基于Java的全文索引/检索引擎——Lucene Lucene不是一个完整的全文索引应用,而是是一个用Java写的全文索引引擎工具包,它可以方便的嵌入到各种应用中实现针对应用的全文索引/检索功能。 Lucene的作者:Lucene的贡献者Doug Cutting是一位资深全文索引/检索专家,曾经是V-Twin搜索引擎(Apple的Copland操作系统的成就之一)的主要开发者,后在Excite担任高级系统架构设计师,目前从事于一些INTERNET底层架构的研究。他贡献出的Lucene的目标是为各种中小型应用程序加入全文检索功能。 Lucene的发展历程:早先发布在作者自己的https://www.doczj.com/doc/5815754932.html,,后来发布在SourceForge,2001年年底成为APACHE基金会jakarta的一个子项目:https://www.doczj.com/doc/5815754932.html,/lucene/ 已经有很多Java项目都使用了Lucene作为其后台的全文索引引擎,比较著名的有: Jive:WEB论坛系统;

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

好程序员大数据ELK相关原理

【原创技术贴】ELK相关原理解析 bin 存放elasticSearch 运行命令 config 存放配置文件 lib 存放elasticSearch运行依赖jar包 modules 存放elasticSearch 模块 plugins 存放插件 1.1 Elasticsearch与Mysql对比 Elasticsearch 集群可以包含多个索引(Index),每个索引可以包含多个类型(Type),每个类型可以包含多个文档(Document),每个文档可以包含多个字段(Field)。以下是 MySQL 和 Elasticsearch 的术语类比图,帮助理解: 就像使用 MySQL 必须指定 Database 一样,要使用 Elasticsearch 首先需要创建Index:client.indices.create({index : 'blog'}); 这样就创建了一个名为 blog的 Index。Type 不用单独创建,在创建 Mapping 时指定就可以。Mapping 用来定义 Document 中每个字段的类型,即所使用的 analyzer、是否索引等属性,非常关键等。 索引对象(blob):存储数据的表结构,任何搜索数据,存放在索引对象上。

映射(mapping):数据如何存放到索引对象上,需要有一个映射配置,包括:数据类型、是否存储、是否分词等。 文档(document):一条数据记录,存在索引对象上。 文档类型(type):一个索引对象存放多种类型数据,数据用文档类型进行标识。 那这里后续编程可分为以下操作步骤: 第一步:建立索引对象。 第二步:建立映射。 第三步:存储数据“文档”。 第四步:指定文档类型进行搜索数据“文档”。 1.2 创建一个索引 Elasticsearch 命令的一般格式是:REST VERBHOST:9200/index/doc-type,其 中 REST VERB 是 PUT、GET 或DELETE。(使用 curlL -X 动词前缀来明确指定 HTTP 方法。)要创建一个索引,可在你的 shell 中运行以下命令:curl -XPUT并对其进行查看。

全文检索lucene研究

本文由美白面膜排行榜https://www.doczj.com/doc/5815754932.html,整理 全文检索lucene研究 1 Lucene简介 Lucene是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎。Lucene以其方便使用、快速实施以及灵活性受到广泛的关注。它可以方便地嵌入到各种应用中实现针对应用的全文索引、检索功能,本总结使用lucene3.0.0 2 Lucene 的包结构 1、analysis对需要建立索引的文本进行分词、过滤等操作 2、standard是标准分析器 3、document提供对Document和Field的各种操作的支持。 4、index是最重要的包,用于向Lucene提供建立索引时各种操作的支持 5、queryParser提供检索时的分析支持 6、search负责检索 7、store提供对索引存储的支持 8、util提供一些常用工具类和常量类的支持 Lucene中的类主要组成如下:

1)org.apache.1ucene.analysis语言分析器,主要用于的切词Analyzer是 一个抽象类,管理对文本内容的切分词规则。 2)org.apache.1uceene.document索引存储时的文档结构管理,类似于关系 型数据库的表结构。 3)document包相对而言比较简单,document相对于关系型数据库的记录对 象,Field主要负责字段的管理。 4)org.apache.1ucene.index索引管理,包括索引建立、删除等。索引包是 整个系统核心,全文检索的根本就是为每个切出来的词建索引,查询时就只需要遍历索引,而不需要去正文中遍历,从而极大的提高检索效率。 5)org.apache.1ucene.queryParser查询分析器,实现查询关键词间的运算, 如与、或、非等。 6)org.apache.1ucene.search检索管理,根据查询条件,检索得到结果。 7)org.apache.1ucene.store数据存储管理,主要包括一些底层的I/0操作。 8)org.apache.1ucene.util一些公用类。 3 Document文档 1)void add(Field field) 往Document对象中添加字段 2)void removeField(String name)删除字段。若多个字段以同一个字段 名存在,则删除首先添加的字段;若不存在,则Document保持不变 3)void removeFields(String name)删除所有字段。若字段不存在,则 Document保持不变 4)Field getField(String name)若多个字段以同一个字段名存在,则 返回首先添加的字段;若字段不存在,则Document保持不变 5)Enumeration fields()返回Document对象的所有字段,以枚举类型返 回 6)Field [] getFields(String name)根据名称得到一个Field的数组 7)String [] getValues(String name)根据名称得到一个Field的值的数 组 Document doc1 = new Document();

Lucene初级教程

Lucene初级教程 2007-12-26 15:24 点击次数:0 次 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品。因此它并不像https://www.doczj.com/doc/5815754932.html,或者google Desktop 那么拿来就能用,它只是提供了一种工具让你能实现这些产品。 2 lucene的工作方式 lucene提供的服务实际包含两部分:一入一出。所谓入是写入,即将你提供的源(本质是字符串)写入索引或者将其从索引中删除;所谓出是读出,即向用户提供全文搜索服务,让用户可以通过关键词定位源。 2.1写入流程 源字符串首先经过analyzer处理,包括:分词,分成一个个单词;去除stopword(可选)。 将源中需要的信息加入Document的各个Field中,并把需要索引的Field索引起来,把需要存储的Field 存储起来。 将索引写入存储器,存储器可以是内存或磁盘。 2.2读出流程 用户提供搜索关键词,经过analyzer处理。 对处理后的关键词搜索索引找出对应的Document。 用户根据需要从找到的Document中提取需要的Field。 3 一些需要知道的概念 3.1 analyzer Analyzer是分析器,它的作用是把一个字符串按某种规则划分成一个个词语,并去除其中的无效词语,这里说的无效词语是指英文中的“of”、“the”,中文中的“的”、“地”等词语,这些词语在文章中大量出现,但是本身不包含什么关键信息,去掉有利于缩小索引文件、提高效率、提高命中率。 分词的规则千变万化,但目的只有一个:按语义划分。这点在英文中比较容易实现,因为英文本身就是以单词为单位的,已经用空格分开;而中文则必须以某种方法将连成一片的句子划分成一个个词语。具体划分方法下面再详细介绍,这里只需了解分析器的概念即可。 3.2 document 用户提供的源是一条条记录,它们可以是文本文件、字符串或者数据库表的一条记录等等。一条记录经过索引之后,就是以一个Document的形式存储在索引文件中的。用户进行搜索,也是以Document列表的形式返回。 3.3 field 一个Document可以包含多个信息域,例如一篇文章可以包含“标题”、“正文”、“最后修改时间”等信息域,这些信息域就是通过Field在Document中存储的。 Field有两个属性可选:存储和索引。通过存储属性你可以控制是否对这个Field进行存储;通过索引属性你可以控制是否对该Field进行索引。这看起来似乎有些废话,事实上对这两个属性的正确组合很重要,下面举例说明:还是以刚才的文章为例子,我们需要对标题和正文进行全文搜索,所以我们要把索引属性设置为真,同时我们希望能直接从搜索结果中提取文章标题,所以我们把标题域的存储属性设置为真,但是由于正文域太大了,我们为了缩小索引文件大小,将正文域的存储属性设置为假,当需要时再直接读取文件;我们只是希望能从搜索解果中提取最后修改时间,不需要对它进行搜索,所以我们把最后修改时间域的存储属性设置为真,索引属性设置为假。上面的三个域涵盖了两个属性的三种组合,还有一种全为假的没有用到,事实上Field不允许你那么设置,因为既不存储又不索引的域是没有意义的。

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