lucene多样化搜索,结果排序。2006-10-31 17:15 一:多样化的搜索

lucene多样化搜索,结果排序。
2006-10-31 17:15

 一:多样化的搜索

/** *** 一个关键字,对一个字段进行查询 **** */
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:首先你要排序的字段必须是被index的,并且是untokenized的。

如:

doc.add(new Field("click", dv.get("click").toString(), Field.Store.NO, Field.Index.UN_TOKENIZED));

2:在检索时候:

如:   
  
   /*****  排序  *****/
   /*
    * 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("click", SortField.INT, true)});
   Hits hits = searcher.search(querystring,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);

 

posted on 2008-09-28 03:15  斯文  阅读(184)  评论(0)    收藏  举报

导航