본문 바로가기

Lucene

[Lucene] NumberType Field 관련

crescent의 색인관리 페이지를 루씬 4.4로 바꾸면서 

한구님께서 만드셨던 부분을 거의 다 손을 댔는데.. 그중 각 필드의 term 개수를 추출하는 부분에서 이상한 현상이 보였다. 

Long 혹은 Integer 타입의 필드에서 term이 이상하게 추출되는 것이었는데..

현상은 두가지로 나타나고 있었다.


1. 색인된 숫자가 깨져서 보임

2. 색인된 숫자보다 더 많은 term이 색인되어있음



테스트 코드를 만들어서 다시 확인을 해봐도 동일한 현상이었다.

stackoverflow에도 같은 현상으로 질문이 올라온 것도 찾았다.

http://stackoverflow.com/questions/11883066/luke-reveals-unknown-term-values-for-numeric-fields-in-index



위 코드는 모두 수정을 한 내용인데..

일단,1번 문제는 색인된 Term을 BytesRef라는 이름의 클래스를 사용해 뽑아내면서 색인된 숫자에 대해서는

NumericUtils.prefixCodedToInt 혹은 ToLong 메서드를 사용해야 정상적인 숫자를 볼 수 있는듯하고... (lucene user group에 질문 올리고 답변 받음.. 근데 왜 이래야하는지는... 아직 잘 모르겠음..;;;)


2번 문제는 루씬에서 숫자형식의 필드를 색인하는 방법에서 발생하는 차이인것으로 보인다.

위 stackoverlfow에도 있는 글에서도..

Within Lucene, each numeric value is indexed as a trie structure, where each term is logically assigned to larger and larger pre-defined brackets (which are simply lower-precision representations of the value). The step size between each successive bracket is called the precisionStep, measured in bits. Smaller precisionStep values result in larger number of brackets, which consumes more disk space in the index but may result in faster range search performance.

위 내용이 핵심인듯하다. 기본적으로 int가 32bit인데반해, 루씬에서의 NumberType Field의 기본적인 precisionStep이 4로 발생하는 문제였던것 같다. 그래서, 위 소스에서 precisionStep을 32로 셋팅을 해서 돌려보면 색인한 value만 딱 나오는 것이 확인된다.


루씬 document에서도 (2.9 기준이긴 하지만..)

range쿼리를 사용하지 않을거라면 precisionStep을 Integer.MAX_VALUE로 설정해도 괜찮다고 되어있다.

If you only need to sort by numeric value, and never run range querying/filtering, you can index using a precisionStep of Integer.MAX_VALUE. This will minimize disk space consumed.


하지만.. 굳이 numbertype field를 쓰면서.. rangeQuery를 안 쓰는 경우가 많지는 않을듯...


암튼.. 이 내용을 바탕으로 다시 수정해봐야겠다.