lucene基本使用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
lucene使用:Lucene基本使用介绍
疯狂代码 / ĵ:http://DeveloperUtil/Article54082.html
. 概述
随着系统信息越来越多如何样从这些信息海洋中捞起自己想要那根针就变得非常重要了全文检索是通常用于解决此类问题方案而Lucene则为实现全文检索工具任何应用都可通过嵌入它来实现全文检索
2. 环境搭建
从上下载最新版本lucene.jar将此jar作为项目build path那么在项目中就可以直接使用lucene了
3. 使用介绍说明
3.1. 基本概念
这里介绍主要为在使用中经常碰到些概念以大家都比较熟悉数据库来进行类比讲解使用Lucene进行全文检索过程有点类似数据库这个过程table---à查询相应字段或查询条件----à返回相应记录首先是IndexWriter通过它建立相应索引表相当于数据库中table在构建此索引表时需指定为该索引表采用何种方式进行构建也就是说对于其中记录字段以什么方式来进行格式划分这个在Lucene中称为AnalyzerLucene提供了几种环境下使用Analyzer:SimpleAnalyzer、StandardAnalyzer、GermanAnalyzer等其中StandardAnalyzer是经常使用它提供了对于中文支持在表建好后我们就需要往里面插入用于索引记录在Lucene中这个称为Document有点类似数据库中table行记录记录中字段添加思路方法在Lucene中称为Field这个和数据库中基本样对于Field Lucene分为可被索引可切分不可被切分不可被索引几种组合类型通过这几个元素基本上就可以建立起索引了
在查询时经常碰到为另外几个概念首先是QueryLucene提供了几种经常可以用到Query:TermQuery、MultiTermQuery、BooleanQuery、WildcardQuery、PhraseQuery、PrefixQuery、PhrasePrefixQuery、FuzzyQuery、RangeQuery、SpanQueryQuery其实也就是指对于需要查询字段采用什么样方式进行查询如模糊查询、语义查询、短语查询、范围查询、组合查询等还有就是QueryParserQueryParser可用于创建区别Query还有个MultiFieldQueryParser支持对于多个字段进行同关键字查询IndexSearcher概念指为需要对何目录下索引文件进行何种方式分析查询有点象对数据库哪种索引表进行查询并按定方式进行记录中字段分解查询概念通过IndexSearcher以及Query即可查询出需要结果Lucene返回为Hits.通过遍历Hits可获取返回结果Document通过Document则可获取Field中相关信息了
通过对于上面在建立索引和全文检索基本概念介绍希望能让你对Lucene建立定了解
3.2. 全文检索需求实现索引建立部分代码:
private void createIndex(String indexFilePath) throws Exception{ IndexWriter iwriter=getWriter(indexFilePath);
Document doc= Document;
doc.add(Field.Keyword("name","jerry"));
doc.add(Field.Text("sender","bluedavy@"));
doc.add(Field.Text("receiver","google@"));
doc.add(Field.Text("title","用于索引标题"));
doc.add(Field.UnIndexed("content","不建立索引内容"));
Document doc2= Document;
doc2.add(Field.Keyword("name","jerry.lin"));
doc2.add(Field.Text("sender","bluedavy@")); doc2.add(Field.Text("receiver","msn@"));
doc2.add(Field.Text("title","用于索引第 2个标题"));
doc2.add(Field.Text("content","建立索引内容"));
iwriter.addDocument(doc);
iwriter.addDocument(doc2);
iwriter.optimize;
iwriter.close;
}
private IndexWriter getWriter(String indexFilePath) throws Exception{ boolean append=true;
File file= File(indexFilePath+File.separator+"segments");
(file.exists)
append=false;
IndexWriter(indexFilePath,analyzer,append);
}
3.2.1. 对于某字段关键字模糊查询
Query query= WildcardQuery( Term("sender","*davy*"));
Searcher searcher= IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for ( i = 0; i < hits.length; i) {
.out.prln(hits.doc(i).get("name"));
}
3.2.2. 对于某字段关键字语义查询
Query query=QueryParser.parse("索引","title",analyzer);
Searcher searcher= IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for ( i = 0; i < hits.length; i) {
.out.prln(hits.doc(i).get("name"));
}
3.2.3. 对于多字段关键字查询
Query query=MultiFieldQueryParser.parse("索引", String{"title","content"},analyzer);
Searcher searcher= IndexSearcher(indexFilePath);
Hits hits=searcher.search(query);
for ( i = 0; i < hits.length; i) {
.out.prln(hits.doc(i).get("name"));
}
3.2.
4. 复合查询(多种查询条件综合查询)
Query query=MultiFieldQueryParser.parse("索引", String{"title","content"},analyzer); Query mquery= WildcardQuery( Term("sender","bluedavy*"));
TermQuery tquery= TermQuery( Term("name","jerry"));
BooleanQuery bquery= BooleanQuery;
bquery.add(query,true,false);
bquery.add(mquery,true,false);
bquery.add(tquery,true,false);
Searcher searcher= IndexSearcher(indexFilePath);
Hits hits=searcher.search(bquery);
for ( i = 0; i < hits.length; i) {
.out.prln(hits.doc(i).get("name"));
}
4.整理总结
相信大家通过上面介绍说明能知道Lucene个基本使用思路方法在全文检索时建议大家先采用语义时搜索先搜索出有意义内容的后再进行模糊的类搜索^_^这个还是需要根据搜索需求才能定了Lucene还提供了很多其他更好用思路方法这个就等待大家在使用过程中自己去进步摸索了比如对于Lucene本身提供Query更熟练掌握对于Filter、Sorter使用自己扩展实现Analyzer自己实现Query等等甚至可以去了解些有关搜索引擎技术(切词、索引排序 etc)等等
2009-1-15 22:31:02
疯狂代码 /。