您的位置:首页 > 其它

lucene多种搜索方式详解例子

2010-03-05 16:10 549 查看
package src;

import java.io.StringReader;

import java.util.Date;

import org.apache.lucene.analysis.Analyzer;

import org.apache.lucene.analysis.SimpleAnalyzer;

import org.apache.lucene.analysis.TokenStream;

import org.apache.lucene.analysis.cjk.CJKAnalyzer;

import org.apache.lucene.analysis.cn.ChineseAnalyzer;

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

import org.apache.lucene.document.DateField;

import org.apache.lucene.document.DateTools;

import org.apache.lucene.document.Document;

import org.apache.lucene.document.Field;

import org.apache.lucene.index.IndexReader;

import org.apache.lucene.index.Term;

import org.apache.lucene.queryParser.MultiFieldQueryParser;

import org.apache.lucene.queryParser.QueryParser;

import org.apache.lucene.search.BooleanClause;

import org.apache.lucene.search.BooleanQuery;

import org.apache.lucene.search.FuzzyQuery;

import org.apache.lucene.search.Hits;

import org.apache.lucene.search.IndexSearcher;

import org.apache.lucene.search.Query;

import org.apache.lucene.search.QueryFilter;

import org.apache.lucene.search.RangeQuery;

import org.apache.lucene.search.Sort;

import org.apache.lucene.search.SortField;

import java.util.Date;

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

import org.apache.lucene.document.Document;

import org.apache.lucene.index.IndexReader;

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.search.highlight.Highlighter;

import org.apache.lucene.search.highlight.QueryScorer;

import org.apache.lucene.search.highlight.SimpleFragmenter;

import org.apache.lucene.search.highlight.SimpleHTMLFormatter;

public class LuceneSearch {

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

LuceneSearch test = new LuceneSearch();

//

Hits h = null;

h = test.search("显示 ");

test.printResult(h);

h = test.search("jy");

test.printResult(h);

h = test.search("djy");

test.printResult(h);

h = test.search("料不");

test.printResult(h);

h = test.search("人");

test.printResult(h);

}

public LuceneSearch(){

try{

searcher = new IndexSearcher(IndexReader.open("E://lucene//test4//index"));

}catch(Exception e){

e.printStackTrace();

}

}

//声明一个IndexSearcher对象

private IndexSearcher searcher = null;

//声明一个Query对象

private Query query = null;

ChineseAnalyzer analyzer = new ChineseAnalyzer();

Highlighter highlighter = null;

public final Hits search(String keyword){

System.out.println("正在检索关键字:"+keyword);

try{

Date start = new Date();

/***** 一个关键字,对一个字段进行查询 *****/

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

query = qp.parse(keyword);

// Hits hits = searcher.search(query);

/***** 模糊查询 *****/

// Term term = new Term("content",keyword);

// FuzzyQuery fq = new FuzzyQuery(term);

// Hits hits = searcher.search(fq);

/***** 一个关键字,在两个字段中查询 *****/

/*

* 1.BooleanClause.Occur[]的三种类型:

* MUST : + and

* MUST_NOT : - not

* SHOULD : or

* 2.下面查询的意思是:content中必须包含该关键字,而title有没有都无所谓

* 3.下面的这个查询中,Occur[]的长度必须和Fields[]的长度一致。每个限制条件对应一个字段

*/

// BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.SHOULD,BooleanClause.Occur.MUST};

// query=MultiFieldQueryParser.parse(keyword,new String[]{"title","content"},flags,analyzer);

/***** 两个(多个)关键字对两个(多个)字段进行查询,默认匹配规则 *****/

/*

* 1.关键字的个数必须和字段的个数相等

* 2.由于没有指定匹配规定,默认为"SHOULD"

* 因此,下面查询的意思是:"title"中含有keyword1 或 "content"含有keyword2.

* 在此例中,把keyword1和keyword2相同

*/

// query=MultiFieldQueryParser.parse(new String[]{keyword,keyword},new String[]{"title","content"},analyzer);

/***** 两个(多个)关键字对两个(多个)字段进行查询,手工指定匹配规则 *****/

/*

* 1.必须 关键字的个数 == 字段名的个数 == 匹配规则的个数

* 2.下面查询的意思是:"title"必须不含有keyword1,并且"content"中必须含有keyword2

*/

// BooleanClause.Occur[] flags = new BooleanClause.Occur[]{BooleanClause.Occur.MUST_NOT,BooleanClause.Occur.MUST};

// query=MultiFieldQueryParser.parse(new String[]{keyword,keyword},new String[]{"title","content"},flags,analyzer);

/***** 对日期型字段进行查询 *****/

/***** 对数字范围进行查询 *****/

/*

* 1.两个条件必须是同一个字段

* 2.前面一个条件必须比后面一个条件小,否则找不到数据

* 3.new RangeQuery中的第三个参数,表示是否包含"="

* true: >= 或 <=

* false: > 或 <

* 4.找出 55>=id>=53 or 60>=id>=57:

*/

// Term lowerTerm1 = new Term("id","53");

// Term upperTerm1 = new Term("id","55");

// RangeQuery rq1 = new RangeQuery(lowerTerm1,upperTerm1,true);

//

// Term lowerTerm2 = new Term("id","57");

// Term upperTerm2 = new Term("id","60");

// RangeQuery rq2 = new RangeQuery(lowerTerm2,upperTerm2,true);

//

// BooleanQuery bq = new BooleanQuery();

// bq.add(rq1,BooleanClause.Occur.SHOULD);

// bq.add(rq2,BooleanClause.Occur.SHOULD);

//手工拼范围

// query = QueryParser.Parse("{200004 TO 200206}", "pubmonth", new SimpleAnalyzer());

// Lucene用[] 和{}分别表示包含和不包含.

//String temp = "startDate:["+nextWeek[0]+" TO "+nextWeek[1]+"] ";

// temp = temp + " OR endDate:["+nextWeek[0]+" TO "+nextWeek[1]+"]";

// Query query1 = qp.parse(temp);

// Hits hits = searcher.search(bq);

/***** 排序 *****/

/*

* 1.被排序的字段必须被索引过(Indexecd),在索引时不能 用 Field.Index.TOKENIZED

* (用UN_TOKENIZED可以正常实现.用NO时查询正常,但排序不能正常设置升降序)

* 2.SortField类型

* SCORE、DOC、AUTO、STRING、INT、FLOAT、CUSTOM

* 此类型主要是根据字段的类型选择

* 3.SortField的第三个参数代表是否是降序

* true:降序 false:升序

*/

// Sort sort = new Sort(new SortField[]{new SortField("id", SortField.INT, true)});

// Hits hits = searcher.search(query,sort);

/*

* 按日期排序

*/

// Sort sort = new Sort(new SortField[]{new SortField("createTime", SortField.INT, false)});

/***** 过滤器 ******/

// QueryParser qp1 = new QueryParser("content",analyzer);

// Query fquery = qp1.parse("我");

//

// BooleanQuery bqf = new BooleanQuery();

// bqf.add(fquery,BooleanClause.Occur.SHOULD);

//

// QueryFilter qf = new QueryFilter(bqf);

Hits hits = searcher.search(query);

Date end = new Date();

System.out.println("检索完成,用时"+(end.getTime()-start.getTime())+"毫秒");

return hits;

}catch(Exception e){

e.printStackTrace();

return null;

}

}

public void printResult(Hits h){

if(h.length() == 0){

System.out.println("对不起,没有找到您要的结果.");

}else{

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

try{

Document doc = h.doc(i);

System.out.println("结果"+(i+1)+":"+doc.get("id")+" createTime:"+doc.get("createTime")+" title:"+doc.get("title")+" content:"+doc.get("content"));

//System.out.println(doc.get("path"));

}catch(Exception e){

e.printStackTrace();

}

}

}

System.out.println("--------------------------------------");

}

}

需要说明的一点是,本例用到了Chinese分析器,需要导入相应的包!

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cool_rain_man/archive/2008/04/03/2247686.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: