本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7590974
建立时间:2006年5月29日




[Apache(jakarta)]lucene多种搜索方式详解例子
软件技术

lhwork 发表于 2006/12/14 10:50:37

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);       // Hits hits = searcher.search(bq);   /***** 排序 *****/   /*   * 1.被排序的字段必须被索引过(Indexecd),在索引时不能 用 Field.Index.TOK


阅读全文(2318) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.326 second(s), page refreshed 144762662 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号