Lucene学习笔记之十六:全部查询出来再取指定范围的文档(分页搜索一)

2019-03-28 00:46|来源: lucene菜鸟

全部查询出来再取指定范围的文档

假设先取出500条searcher.search(q, 500),然后再for循环取出指定部分for(inti=start;i<end;i++) {...},详细代码如下:

public void searchPage(String query,int pageIndex,int pageSize) {

   try {

       Directory dir = FileIndexUtils.getDirectory();

       IndexSearcher searcher =  getSearcher(dir);

       QueryParser parser = new QueryParser(Version.LUCENE_35,

               "content",new  StandardAnalyzer(Version.LUCENE_35));

       Query q = parser.parse(query);

       TopDocs tds = searcher.search(q, 500);

       ScoreDoc[] sds = tds.scoreDocs;

       int start = (pageIndex-1)*pageSize;

       int end = pageIndex*pageSize;

       for(int i=start;i<end;i++) {

           Document doc =  searcher.doc(sds[i].doc);

           System.out.println(sds[i].doc+":"+doc.get("path")+

                   "-->"+doc.get("filename"));

       }

       searcher.close();

   } catch  (org.apache.lucene.queryParser.ParseException e) {

       e.printStackTrace();

   } catch (IOException e) {

       e.printStackTrace();

   }

}

本文链接:Lucene学习笔记之十六:全部查询出来再取指定范围的文档(分页搜索一),转载请注明出处:http://www.javadx.com/article/788

相关问答

更多
  • MYSQL现在都支持中文的全文检索为什么不用??match against 对一般的网站来说 速度也不是很慢。。或者你直接上JAVA的lucene
  • 是的,可以使用块连接 。 有一些限制,但应该适用于您的用例。 当然你也可以在一个索引中自己完成(通过运行多个查询或创建一个SearchComponent)(你不需要在索引中有一个'排序'的文档,你可以混合使用小部件和待办事项很好),但我会使用块连接。 yes it is possible using block join. Has some limitations but should work for your use case. Of course you can also do this on you ...
  • 好吧,似乎给该字段提供一个默认值(0或其他)是我能想到的唯一解决方案。 更好的解决方案 *:* AND -ref_user_id:[* TO *] Ok, seems give the field with a default value(0 or something else) is the only solution I can come up with. The better solution *:* AND -ref_user_id:[* TO *]
  • 将不同的实体类型放入同一个索引时应该小心 如果你搜索“id:1”,你怎么知道你是否已经检索了一个Dash或一个活动? 或者: 确保字段名称是唯一的,即“dash_id”,“activity_id” 添加一个“_type”字段并添加“_type:dash”或“_type:activity”作为搜索的过滤器 至少在当前的Lucene.net(3.0.3)中, 你不能在单个查询中进行“加入” Lucene是一种文档数据存储,有些方式就像一个键值存储。 每个文档都是“只是一堆领域”。 你可以查询每个实体,然后使用L ...
  • 通过调用getBestFragment而不是getBestFragments ,每个文档只能获得一个片段。 如果您的搜索调用多次返回相同的文档,则您的索引中很可能会有多个同一文档的副本。 如果您打算创建一个新索引,请确保打开IndexWriter ,并将其OpenMode设置为: IndexWriterConfig.OpenMode.CREATE 。 You get only one fragment per document returned from the search by calling getB ...
  • 制作自己的查询解析器: class MyParser : MultiFieldQueryParser { @override public Query getFieldQuery(string field, string queryText) { if lookupSuccessful(field, queryText) { return myQuery(field, queryText); } return base.getFieldQuery(fie ...
  • 在Lucene中查询语法: +(someField:bar someField:baz) +anotherField:foo “+”表示该术语是必需的,就像Google搜索语法一样。 括号将术语组成单个术语。 没有“+”(或“ - ”),术语是可选的; 至少有一个术语必须匹配,匹配的术语越多,得分越高。 将此字符串传递给QueryParser以创建Query对象。 然后,可以根据您的需要将查询传递给多种搜索方法之一。 In Lucene query syntax: +(someField:bar some ...
  • 问题是您将NUMBER_OF_ARGUMENTS字段索引为IntField ,但从索引传回的版本是StoredField 。 重新索引它时,它不再格式化为IntField ,因此NumericRangeQuery不会得到任何结果。 您只需将NUMBER_OF_ARGUMENTS查询字词设置为Occur.SHOULD子句,即可查看问题出在该字段上。 一种解决方案是手动将该字段重新添加到文档中,例如: public static void main(String[] args) throws IOExcepti ...