lucene 查询 搜索结果不全 有的搜不到

wgfstudent 2013-11-19 04:39:27
/**
* @desc::在类TestLucene中建立一个新的方法searcher(String),它返回的是一个搜索的结构集,
* 相当于数据库中的ResultSet一样。它代的参数是你要查询的内容。这里,我把要查询的字段写死了。
* 你可以在添加一个参数表示要查询的字段。这里主要有两个对象IndexSearcher和Query。
* IndexSearcher是找到索引数据库,Query是处理搜索,它包含了三个参数:查询内容,查询字段,分析器。
* @param queryString String 要查询的关键字
* @param shownum 要查询的条数
* @param leibie 搜索路径根据不同需求搜不同索引
* @return Hits
*/
public List seacher(String queryString,int shownum,String leibie){
//保存索引文件的地方
String indexDir = leibie;

try {
Directory dir = null;
dir = new SimpleFSDirectory(new File(indexDir));
//创建 IndexSearcher对象,相比IndexWriter对象,这个参数就要提供一个索引的目录就行了
IndexSearcher indexSearch = new IndexSearcher(dir);
//创建QueryParser对象,第一个参数表示Lucene的版本,第二个表示搜索Field的字段,第三个表示搜索使用分词器
//---单个字段搜索
// QueryParser queryParser = new QueryParser(Version.LUCENE_30,"topic", new StandardAnalyzer(Version.LUCENE_30));
//---多个字段搜索String[]{"topic","content"}
QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, new String[]{"topic"}, new StandardAnalyzer(Version.LUCENE_30));
//生成Query对象
Query query = null;
queryParser.setDefaultOperator(Operator.OR);//测试wgf

query = queryParser.parse(queryString);

// 排序: 先API中文名,后描述
//Sort sort;
// sort = new Sort(new SortField[]{new SortField("sorttime", SortField.STRING, false)});
SortField sortArray[];
SortField sortField1 = new SortField("sorttime", SortField.STRING, false);// false代表升序,TRUE代表降序
sortArray = new SortField[] { sortField1 };
Sort sort = new Sort(sortArray);
// SortField sortField2 = new SortField("contents",
// SortField.STRING,
// false);// false代表升序,TRUE代表降序
// sortArray = new SortField[] { sortField1, sortField2 };
// Sort sort = new Sort(sortArray);
// TopDocs topDocs = indexSearch.search(query, null, 1000, sort);

//搜索结果 TopDocs里面有scoreDocs[]数组,里面保存着索引值
TopDocs hits = indexSearch.search(query,null,shownum,sort);
//hits.totalHits表示一共搜到多少个
System.out.println("找到了" + hits.totalHits + "个");
RowSum = hits.totalHits;//一共的条数
//循环hits.scoreDocs数据,并使用indexSearch.doc方法把Document还原,再拿出对应的字段的值
List list = new ArrayList();
for (int i = 0; i < hits.scoreDocs.length; i++) {
ScoreDoc sdoc = hits.scoreDocs[i];
Document doc = indexSearch.doc(sdoc.doc);
//System.out.println(doc.get("topic")+"----"+doc.get("sorttime")+"----"+doc.get("url"));
//将信息存入list
ContentInfo ci = new ContentInfo(fS(doc.get("topic")),fS(doc.get("content")),fS(doc.get("url")),fS(doc.get("sorttime")));
list.add(ci);
}
indexSearch.close();
return list;
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception ex1) {
ex1.printStackTrace();
}
return null;
}
...全文
79 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧