1

ConstantScoreRangeQuery範囲が0.0.0.0からである範囲のすべてのIPアドレスを検索するために使用しています255.255.255.255。これは、ほとんどすべてのIPv4アドレスを検索しています。

すべてのIPアドレスを文字列に変換し、インデックスを作成しています。たとえば、2文字ごとに1オクテットになる0.0.0.0ようになります。00000000255.255.255.255ffffffff

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 アドレスを文字列に変換してインデックスを作成しています

このアプローチは間違っています。のJavadocは次のようにConstantScoreRangeQuery述べています。

このクエリは、String.compareTo(String) に従って指定された範囲に入る用​​語を探しているドキュメントと一致します。数値範囲を意図したものではありません。代わりに NumericRangeQuery を使用してください。

で IP 範囲を照会する方法はありませんString.compareTo(String)

IP アドレスを数値としてインデックス化し、特定の範囲内 (および範囲外) の意味を定義するロジックを定義する必要があります。

その上、ConstantScoreRangeQueryは廃止され、バージョン 3 で削除されました。新しい Lucene バージョンにアップグレードする必要があります (v4.0 は現在リリースされています)

于 2012-11-15T15:55:21.630 に答える
0

6 番目の引数としてコンストラクターに渡されるカスタム Collat​​or で TermRangeQuery を使用できます。

Collat​​or を実装するだけで、String.compareTo は、指定したとおりにフォーマットされた IPv4 アドレスを比較するのにうまく機能するはずです。

IPv6 の一致を排除するには、最初に長さをチェックし、ゼロ以外の長さの違いに応じて正または負の結果を返し、長さが等しい場合にのみ String.compareTo の結果を返します。

別のオプションとして、インデックス形式をわずかに変更できる場合は、格納された値に IP バージョンのプレフィックスを付けることができます (例:v4ffffffffまたはv6ffffffffffffffff. その場合、そのプレフィックスを各値とクエリに一貫して適用する限り、指定した引数を持つ標準の TermRangeQuery がうまく機能するはずです。

于 2012-11-16T05:27:59.360 に答える