1

ConstantScoreRangeQuery用于搜索 range 所在范围的所有 IP0.0.0.0地址255.255.255.255。这几乎是在搜索所有 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 地址。

4

2 回答 2

0

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

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

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

您无法使用String.compareTo(String).

您需要将 IP 地址索引为数字并定义逻辑,通过该逻辑来定义在(和超出)给定范围内的含义。

最重要的是,ConstantScoreRangeQuery已弃用并已在版本 3 中删除。您确实必须升级到更新的 Lucene 版本(现已推出 v4.0)。

于 2012-11-15T15:55:21.630 回答
0

您可以将TermRangeQuery与作为第六个参数传递给构造函数的自定义Collat ​​or 一起使用。

只需实现一个 Collat​​or,String.compareTo 应该可以很好地比较您指定格式的 IPv4 地址,除非我缺少某些东西。

为了消除 IPv6 匹配,您可以首先检查长度,根据非零长度差异返回正或负结果,如果长度相等,则仅返回 String.compareTo 的结果。

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

于 2012-11-16T05:27:59.360 回答