RangeQuery替代方案

由于需要对数据的范围进行限制,所以就用到了这个类.
Term begin = new Term("field1","418815290");
Term end = new Term("field1","418847590");
RangeQuery query1 = new RangeQuery(begin, end, true);
当转换成BooleanQuery来查询的时候,会生成大于1024个TermQuery..
所以提示:org.apache.lucene.search.BooleanQuery$TooManyClauses

 

1.
ConstantScoreRangeQuery cQuery =new ConstantScoreRangeQuery("number","1","999999",true,true); 
2.

BooleanQuery.setMaxClauseCount(10000000);

3.

通过RangeFilter

RangeFilter filter=new RangeFilter("viewedcount""0000010000","0150000000"truetrue);
IndexSearch.search(Query query,Filter filter),

ConstantScoreRangeQuery其实是通过用RangeFilter来实际这个范围查询的..

RangeFilter的实现方式是通过循环所有的document。先从Range中拿到最小的值的Term。看能不能在所有的document中找到相应的document。如果找不到的话。。就直接跳出循环。。。

如果能找到对应的document。直通过while循环。。那到一个个document.然后取对应Field的值与Range最大范围的值比较。如果小就加入Bits..

 

  if (upperTerm != null) {
  int compare = upperTerm.compareTo(term.text());
                           if ((compare < 0) ||
                                    (!includeUpper && compare==0)) {
                                    break;
                                }
                            }
                            termDocs.seek(enumerator.term());
                            while (termDocs.next()) {
                                bits.set(termDocs.doc());
                            }

Lucene 部分代码         

 

 

另外有一个想法:()

把范围最小的封装成一个TermQuery.

把范围最大的也封装成一个TermQuery..

  TermQuery query=new TermQuery(new Term("number","1"));
  TermQuery query2=new TermQuery(new Term("number","9999"));
  Hits hits1=indexSearcher.search(query);
  Hits hits2=indexSearcher.search(query2);

拿到最小和最大的document id..循环从最小到最大doc id..

 

               

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RangeQuery是一种搜索引擎中常用的查询方式,用于根据某个字段的范围进行查询。在引用\[2\]中的示例中,展示了一个查询年龄大于等于25且小于30岁的文档的RangeQuery示例。通过指定字段名和范围条件,可以筛选出符合条件的文档。 在引用\[1\]中提到了一种非常怪异的实现方式,用于解决二维坐标查询的问题。这种实现方式通过先过滤x和y坐标,再过滤其他条件,可以有效地进行坐标查询。而在引用\[3\]中提到了一种简单的办法,即将x和y坐标有序地保存,并使用二分查找定位到指定范围内的坐标,然后进行and操作,以获取符合条件的结果。 综上所述,RangeQuery是一种常用的查询方式,可以根据字段的范围进行查询。在二维坐标查询中,可以使用特定的实现方式或简单的办法来进行坐标范围的查询。 #### 引用[.reference_title] - *1* *3* [范围搜索 (Range Query)](https://blog.csdn.net/shahdza/article/details/7844836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [4.3 ElasticSearch搜索之Range Query](https://blog.csdn.net/Jgx1214/article/details/120118545)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值