查询lucene结果集的分数
public static void testSearcher(String keywords) throws Exception{
IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
//需要根据那几个字段进行检索...
String fields []={"title"};
QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getMatchVersion(),fields,LuceneUtils.getAnalyzer());
Query query=queryParser.parse(keywords);
//检索符合query 前面N条记录...
TopDocs topDocs=indexSearcher.search(query, 100);
ScoreDoc scoreDocs []=topDocs.scoreDocs;
for(ScoreDoc scoreDoc:scoreDocs){
//VSM
Document document=indexSearcher.doc(scoreDoc.doc);
System.out.println("文档编号,id"+document.get("id") +"====得分===="+scoreDoc.score);
}
}
排序优化
//索引在硬盘里面...
Directory directory1=FSDirectory.open(new File(Contants.INDEXURL));
IOContext ioContext=new IOContext();
//索引放在内存当中...
Directory directory=new RAMDirectory(directory1,ioContext);
IndexReader indexReader=DirectoryReader.open(directory);
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
String fields []={"title"};
QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getMatchVersion(),fields,LuceneUtils.getAnalyzer());
//不同的规则构造不同的子类..
//title:keywords ,content:keywords
Query query=queryParser.parse("抑郁症");
Sort sort=new Sort();
//升序
//SortField sortField=new SortField("id", Type.INT);
//降序
SortField sortField=new SortField("id", Type.INT,true);
//设置排序的字段...
sort.setSort(sortField);
TopDocs topDocs=indexSearcher.search(query,100,sort);
for(ScoreDoc scoreDoc:topDocs.scoreDocs){
Document document=indexSearcher.doc(scoreDoc.doc);
System.out.println(document.get("id"));
}
过滤
//索引在硬盘里面...
Directory directory1=FSDirectory.open(new File(Contants.INDEXURL));
IOContext ioContext=new IOContext();
//索引放在内存当中...
Directory directory=new RAMDirectory(directory1,ioContext);
IndexReader indexReader=DirectoryReader.open(directory);
IndexSearcher indexSearcher=new IndexSearcher(indexReader);
String fields []={"title"};
QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getMatchVersion(),fields,LuceneUtils.getAnalyzer());
//不同的规则构造不同的子类..
//title:keywords ,content:keywords
Query query=queryParser.parse("抑郁症");
/**
* 1:需要根据那个字段进行过滤
*
*
* 2:字段对应的最小值
*
* 3:字段对应的最大值
*
* 4:是否包含最小值
*
* 5:是否包含最大值...
*
*
*/
//filter 是一个抽象类,定义不同的filter 相当于是不同的过滤规则...
Filter filter=NumericRangeFilter.newIntRange("id", 1, 10, false, true);
TopDocs topDocs=indexSearcher.search(query,filter,100);
for(ScoreDoc scoreDoc:topDocs.scoreDocs){
Document document=indexSearcher.doc(scoreDoc.doc);
System.out.println(document.get("id"));
}
查询
public class TestQuery {
public static void main(String[] args) throws Exception {
//testQuery();
//第一种查询,TermQuery
// Query query=new TermQuery(new Term("author","毕加索"));
//第二种查询:字符串搜索..
// String fields []={"author"};
//
// QueryParser queryParser=new MultiFieldQueryParser(LuceneUtils.getMatchVersion(),fields,LuceneUtils.getAnalyzer());
// Query query=queryParser.parse("毕加索");
//
// //author:毕 author:加
//第三种查询:查询所有..
// Query query=new MatchAllDocsQuery();
//第四种查询:范围查询,可以使用此查询来替代过滤器...
//我们完成一种需求有两种方式,我们推荐用这种...性能比filter要高
// Query query=NumericRangeQuery.newIntRange("id", 1, 10, true, true);
//第五种查询:通配符。。。
//?代表单个任意字符,* 代表多个任意字符...
// Query query=new WildcardQuery(new Term("title", "luce*"));
//第六种查询:模糊查询..。。。
//author String
/**
* 1:需要根据查询的条件
*
*
* 2:最大可编辑数 取值范围0,1 ,2
* 允许我的查询条件的值,可以错误几个字符...
*
*/
Query query=new FuzzyQuery(new Term("author", "爱新觉罗杜小"),1);
testQuery(query);
}
public static void testQuery(Query query) throws Exception{
IndexSearcher indexSearcher=LuceneUtils.getIndexSearcher();
TopDocs topDocs=indexSearcher.search(query,100);
for(ScoreDoc scoreDoc:topDocs.scoreDocs){
Document document=indexSearcher.doc(scoreDoc.doc);
System.out.println(document.get("id"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
System.out.println(document.get("author"));
System.out.println(document.get("link"));
}
}
}