Lucene是apache组织的一个用java实现全文搜索引擎的开源项目。其功能非常的强大,api也很简单。Lucene 其实很简单的,它最主要就是做两件事:建立索引和进行搜索
来看一些在lucene中使用的术语,这里并不打算作详细的介绍,提一下,让大家有一个大体上的了解。
建立索引时最重要的几个lucene的术语:
IndexWriter:lucene中最重要的的类之一,它主要是用来将文档加入索引,同时控制索引过程中的一些参数使用。
Analyzer:分析器,主要用于分析搜索引擎遇到的各种文本。常用的有StandardAnalyzer分析器,StopAnalyzer分析器,WhitespaceAnalyzer分析器等。
Directory:索引存放的位置;lucene提供了两种索引存放的位置,一种是磁盘,一种是内存。一般情况将索引放在磁盘上;相应地lucene提供了FSDirectory和RAMDirectory两个类。
Document:文档;Document相当于一个要进行索引的单元,任何可以想要被索引的文件都必须转化为Document对象才能进行索引。
Field:字段。Field是lucene比较多概念一个术语,相对其他术语而言是比较复杂的;
从源代码中,可以看出其构造函数如下:
{code}
Field(String name, byte[] value, Field.Store store)
Field(String name, Reader reader)
Field(String name, Reader reader, Field.TermVector termVector)
Field(String name, String value, Field.Store store, Field.Index index)
Field(String name, String value, Field.Store store, Field.Index index, Field.TermVector termVector){code}
在Field当中有三个内部类:Field.Index,Field.Store,Field.termVector,而构造函数也用到了它们;其中termVector是Lucene 1.4.3新增的它提供一种向量机制来进行模糊查询,很少用。
Field.Index有四个属性,分别是Field.Index.NO_NORMS,Field.Index.NO,Field.Index.TOKENIZED,和Field.Index.UN_TOKENIZED;
Field.Store也有三个属性,分别是Field.Store.COMPRESS,Field.Store.YES和Field.Store.NO;
Field.Index和Field.Store两个字段的不同组合,有不同的用途常用的组合有:
{code}
Field.Index Field.Store 用途说明
TOKENIZED(分词) 是:YES 主要用来文档的标题和内容
TOKENIZED(分词) 是:YES 主要用来文档的标题和内容
TOKENIZED 否:NO 文档的内容
TOKENIZED 否:NO 文档的内容
UN_TOKENIZED 是/否:YES/NO 设置为不被分词,作为整体被搜索,搜其中的一部分是搜不出来的;不推荐使用。
UN_TOKENIZED 是/否:YES/NO 设置为不被分词,作为整体被搜索,搜其中的一部分是搜不出来的;不推荐使用。
NO 否:NO 暂时lucene中没有这一种用法
NO 否:NO 暂时lucene中没有这一种用法
NO 是:YES 内容不能被搜索,只是被搜索内容的附加特性:如文档的类型
NO 是:YES 内容不能被搜索,只是被搜索内容的附加特性:如文档的类型
{code}
上面所说的Field属性与lucene1.4.3版本的有比较大的不同,在旧版的1.4.3里lucene是通过Field.Keyword(...),FieldUnIndexed(...),FieldUnstored(...)和Field.Text(...)来设置不同字段的类型,以达到不同的用途,具体可以参考lucene官方的文档。
还有一点说明,其中的两个构造函数:
Field(String name, Reader reader)
Field(String name, Reader reader, Field.TermVector termVector)
看一下源代码就知道,其默认的值为Field.Store.NO和Field.Index.TOKENIZED。
下一步,再看一下lucene进行搜索时利用到几个最常用术语名称:
IndexSearcher:是lucene中最基本的检索工具,所有的检索都会用到IndexSearcher工具;
Query:查询,lucene中支持模糊查询,语义查询,短语查询,组合查询等等,如有TermQuery,BooleanQuery,RangeQuery,WildcardQuery等一些类。
QueryParser: 是一个解析用户输入的工具,可以通过扫描用户输入的字符串,生成Query对象。
Hits:在搜索完成之后,需要把搜索结果返回并显示给用户,只有这样才算是完成搜索的目的。在lucene中,搜索的结果的集合是用Hits类的实例来表示的。
下面看一下一个简单的实例:
首先把lucene的包放在classpath路径中去,写下面一个简单的类:
{code}
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 springside com",Field.Store.YES,Field.Index.TOKENIZED));
Document doc2 = new Document();
doc2.add(new Field("name", "lighter blog",Field.Store.YES,Field.Index.TOKENIZED));
IndexWriter writer = new IndexWriter(FSDirectory.getDirectory(path, true), new StandardAnalyzer(), 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("springside");
hits = searcher.search(query);
System.out.println("查找\"springside\" 共" + hits.length() + "个结果");
}
}
{code}
执行的结果:
查找"lighter" 共2个结果
查找"springside" 共1个结果
[收藏自:http://wiki.springside.org.cn/pages/diffpages.action?originalId=1689&pageId=1690] 查看原网页