2012-11-15 2 views
1

0.0.0.0에서 255.255.255.255 범위의 모든 IP 주소를 검색하는 데 ConstantScoreRangeQuery을 사용하고 있습니다. 이것은 거의 모든 IPv4 주소를 검색합니다.ConstantScoreRangeQuery가 IP 범위 쿼리에 대해 올바른 결과를 제공하지 않습니다.

모든 IP 주소를 문자열로 변환하고 색인을 생성합니다. 예를 들어, 0.0.0.000000000이되고 255.255.255.255ffffffff이되며 여기서 각 2 개의 문자는 1 옥텟입니다. I에서 IPv4는 물론 IPv6 모두를 저장하고 ConstantScoreRangeQuery(fldIdStr, "00000000", "ffffffff", true, true)

: 나는 IP 주소를 검색하고 할 때 다음과 같이

, 나는 쿼리를 만드는 오전. 이 쿼리는 IPv6도 반환합니다.

Lucene (lucene-core-2.4.0.jar) 2.4.0을 사용하고 있습니다.

IP 범위 내에서 IPv4 주소 만 가져 오는 방법은 무엇입니까?

답변

0

내가 문자열 내 모든 IP 주소를 변환하고

에게이 방법을 색인하고하는 것은 잘못된 것입니다. ConstantScoreRangeQueryJavadoc는 말한다 :

이 쿼리는 String.compareTo가 (문자열)에 따라 제공된 범위에 해당 용어를 찾고 문서와 일치합니다. 숫자 범위 용으로 설계된 이 아니며 대신 NumericRangeQuery를 사용하십시오.

String.compareTo(String)으로 IP 범위를 쿼리 할 수있는 방법은 없습니다.

IP 주소를 숫자로 색인화하고 지정된 범위 내에서 (그리고 범위 밖으로) 의미하는 것을 정의하는 논리를 정의해야합니다. 그 꼭대기에

ConstantScoreRangeQuery이되지 않으며 당신 정말 버전 3에서 제거 된 것은 (버전 4.0은 이제 밖으로) 새로운 루씬 버전으로 업그레이드해야합니다.

+0

내 대답에 뭔가 빠져있을 수 있습니다. 왜 IPv4.com 주소를 String.compareTo와 비교할 수 없습니까?내 생각에, 사전 편집 순서는 보장 된 동일한 길이의 두 16 진수를 비교하는 데는 잘 작동합니다. – femtoRgon

+0

그리고 정확히 ipv6 주소와 ipv6 주소를 어떻게 비교 하시겠습니까? 또한 CIDR 표기법 및 정수 표기법이 있음을 잊지 마십시오. http : // 2915189354 (링크 작동을위한 공간 제거) – mindas

+0

예, 지정된 표기법을 사용하지 않고 IP 주소를 비교하는 것은 상당히 복잡하지만 OP가 CIDR, 정수 및 점 십진수 표기법을 없앰으로써 형식 (간단히 8 자리 16 진수)이 유일한 문제는 IPv6 결과를 제거하는 것입니다. 맞습니까? – femtoRgon

0

여섯 번째 인자로 Collator이 전달 된 TermRangeQuery을 생성자에 전달할 수 있습니다.

Collator를 구현하기 만하면 String.compareTo가 지정된 형식의 IPv4 주소를 비교할 때 제대로 작동해야합니다. 빠진 것이없는 한.

IPv6 일치를 제거하려면 먼저 길이를 검사하고 길이가 0이 아닌 차이에 대해 양수 또는 음수 결과를 반환하고 길이가 동일한 경우에만 String.compareTo 결과를 반환 할 수 있습니다.

인덱스 형식을 약간 변경하는 것이 가능하면 v4ffffffff 또는 v6ffffffffffffffff과 같은 IP 버전으로 저장된 값 앞에 접두어를 붙일 수도 있습니다. 이 경우 각 값과 검색어에 해당 프리픽스를 일관되게 적용하는 한 귀하가 명시한 인수가있는 표준 TermRangeQuery가 작업을 훌륭하게 수행해야합니다.

관련 문제