`
Clayz
  • 浏览: 293652 次
  • 性别: Icon_minigender_1
  • 来自: 东京
社区版块
存档分类
最新评论

lucene常用搜索排序摘录

阅读更多

一,查询

 

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

 

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);
 

--------------------------------------------------

 

默认情况下,IndexSearcher类的search方法返回查询结果时,是按文档的分值排序的,可以使用重载的search方法对结果排序
IndexSearcher.search(Query,Sort);
new Sort() 和 Sort.RELEVANCE,以及null一样,采用默认排序,要定义排序字段,方法是将字段传入Sort对象
Sort sort = new Sort(String field);
也可以对多个字段排序Sort sort = new Sort(String[] fields);
例:
Sort sort = new Sort(new SortField[]{new SortField(“title”),new SortField(“name”)});
Hits hits=searcher.search(query,Sort);

多字段查找MultiFieldQueryParser
只在某些Term中查找,不关心在哪个字段
Query query = new MultiFieldQueryParser.parse(“word”,new String[]{“title”,”content”},analyzer); //在title和content中找word
多字段时默认是OR关系,要改变它,使用以下方法:
Query query = MultiFieldQueryParser.parse(“word”,new String[]{“title”,”content”},new int[]{MultiFieldQueryParser.REQUIRED_FIELD,MultiFieldQueryParser.PROHIBITED_FIELD},analyzer);
其中:
REQUIRED_FIELD 表示该条件必须有
PROHIBITED_FIELD 表示必须不含

搜索多个索引文件MultiSearcher
1) 建立多个索引:使用不同的索引目录,实例化不同的IndexWriter
2) 建立多索引搜索器:
Searcher[] searchers = new SEARCHER[2];
Searchers[0] = new IndexSearcher(dir1); //搜索索引目录一
Searchers[1]= new IndexSearcher(dir2);//搜索索引目录二
Searcher searcher = new MultiSearcher(serarchers);
3) 开始查询:Hits hits = searcher.search(query);
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics