我使用ConstantScoreRangeQuery搜索范围从0.0.0.0到255.255.255.255的所有IP地址。这相当于搜索所有的IPv4地址。
我正在将我所有的IP地址转换为字符串,并对它们进行索引。例如,0.0.0.0变为00000000,255.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地址。
发布于 2012-11-15 23:55:22
我正在将我所有的IP地址转换为字符串并对它们进行索引
这种方法是错误的。ConstantScoreRangeQuery的Javadoc说:
此查询根据String.compareTo(字符串)匹配文档,查找落入所提供范围的术语。它不适用于数字范围,请改用NumericRangeQuery。
您无法使用String.compareTo(String)查询IP范围。
您需要将IP地址作为数字进行索引,并定义逻辑,通过该逻辑可以定义位于(和超出)给定范围的含义。
最重要的是,ConstantScoreRangeQuery已经被弃用,并在版本3中被删除。你真的需要升级到新的版本(v4.0现在已经出来了)。
发布于 2012-11-16 13:27:59
您可以使用带有作为第六个参数传递给构造函数的自定义Collator的TermRangeQuery。
只需实现一个排序器,String.compareTo就可以很好地比较您指定的格式化的IPv4地址,除非我遗漏了什么。
要消除长度匹配,可以首先检查IPv6,针对非零长度差异返回适当的正或负结果,如果长度相等,则只返回String.compareTo的结果。
另一种选择是,如果稍微更改索引格式是可行的,您可以在存储值前面加上IP版本,例如:v4ffffffff或v6ffffffffffffffff。在这种情况下,只要您始终将该前缀应用于每个值和查询,包含您所述参数的标准TermRangeQuery就可以很好地完成这项工作。
https://stackoverflow.com/questions/13397165
复制相似问题