Lucene学习,一直想获取全部数据,拿来进行分页。但是一直没有发现合适的方法。Lucene并不提供无条件查询。所以自己总结两个方法,其中一个是来自网络的Lucene自身提供的。另一个是自己原创的。本文适合对Lucene索引和搜索程序有一定认识的人士!完全不会的需要稍微补习!
第一个方法:用 searcher.MaxDoc(); 获取全部最大文档数。缺点是,无法排序,最后写入的文档放在最前面了。
提示性代码片段
//建立分析器
Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
//建立索引搜索,指定索引目录
IndexSearcher searcher = new IndexSearcher(FSDirectory.Open(new System.IO.DirectoryInfo(IndexPath)), true);
//获取最大文档数量
count = searcher.MaxDoc();
[20111117]补充一下:MaxDoc()是所有文档数,包括删除和未删除的文档。NumDocs()则是所有未被删除的文档总数。而NumDocs()是在IndexReader类下。读取也可以使用IndexReader来实现。
第二个方法:加入一个特定的标识字段,用一个短,特殊的字符做值,需要在索引的时候就加入。
提示性代码片段
Document doc = new Document();
//加入字段
doc.Add(new Field("AllFieldFlag", "★", Field.Store.YES, Field.Index.NOT_ANALYZED));
//加入索引文档
writer.AddDocument(doc);
然后在搜索的时候加入一个固定搜索条件,就是对这个加入字段的搜索,值就用自定义的拿个符号
//建立分析器
Analyzer analyzer = new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29);
//建立索引搜索,指定索引目录
IndexSearcher searcher = new IndexSearcher(FSDirectory.Open(new System.IO.DirectoryInfo(IndexPath)), true);
MultiFieldQueryParser parser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29, new string[] { "AllFieldFlag" }, analyzer);
//建立查询器,用剖析器建立查询
Query query = parser.Parse("★");
//排序
Sort sort = new Sort(new SortField("CreateDatetime", SortField.STRING));
//在查询上开始查询并将结果送入搜集器
searcher.Search(query, new QueryWrapperFilter(query), hits);
..........
可以排序,只是在搜索时调整好自带条件和 外部条件的组合。
如果有错误,更好的方法请说!