首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ConstantScoreRangeQuery没有为ip范围查询提供正确的结果

ConstantScoreRangeQuery没有为ip范围查询提供正确的结果
EN

Stack Overflow用户
提问于 2012-11-15 20:02:02
回答 2查看 360关注 0票数 1

我使用ConstantScoreRangeQuery搜索范围从0.0.0.0255.255.255.255的所有IP地址。这相当于搜索所有的IPv4地址。

我正在将我所有的IP地址转换为字符串,并对它们进行索引。例如,0.0.0.0变为00000000255.255.255.255变为ffffffff,其中每2个字符是一个二进制八位数。

当我搜索IP地址时,我创建了一个如下查询:ConstantScoreRangeQuery(fldIdStr, "00000000", "ffffffff", true, true)

我同时存储了IPv4和IPv6。该查询也返回IPv6。

我使用Lucene (lucene-core-2.4.0.jar) 2.4.0;

如何仅获取IP范围内的IPv4地址。

EN

回答 2

Stack Overflow用户

发布于 2012-11-15 23:55:22

我正在将我所有的IP地址转换为字符串并对它们进行索引

这种方法是错误的。ConstantScoreRangeQueryJavadoc说:

此查询根据String.compareTo(字符串)匹配文档,查找落入所提供范围的术语。它不适用于数字范围,请改用NumericRangeQuery。

您无法使用String.compareTo(String)查询IP范围。

您需要将IP地址作为数字进行索引,并定义逻辑,通过该逻辑可以定义位于(和超出)给定范围的含义。

最重要的是,ConstantScoreRangeQuery已经被弃用,并在版本3中被删除。你真的需要升级到新的版本(v4.0现在已经出来了)。

票数 0
EN

Stack Overflow用户

发布于 2012-11-16 13:27:59

您可以使用带有作为第六个参数传递给构造函数的自定义CollatorTermRangeQuery

只需实现一个排序器,String.compareTo就可以很好地比较您指定的格式化的IPv4地址,除非我遗漏了什么。

要消除长度匹配,可以首先检查IPv6,针对非零长度差异返回适当的正或负结果,如果长度相等,则只返回String.compareTo的结果。

另一种选择是,如果稍微更改索引格式是可行的,您可以在存储值前面加上IP版本,例如:v4ffffffffv6ffffffffffffffff。在这种情况下,只要您始终将该前缀应用于每个值和查询,包含您所述参数的标准TermRangeQuery就可以很好地完成这项工作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13397165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档