2013-04-18 2 views
1

Lucene.Net을 사용하는 응용 프로그램에서 정수를 저장하는 숫자 필드가 있습니다. 값의 카디널리티는 다소 낮습니다 (일반적으로 20-30 개 미만의 다른 값).Lucene의 숫자 필드에면 처리를 수행하는 특별한 방법이 있습니까?

나는이 필드를 통해 파셋 검색을하고 싶다. (기여 패키지의 SimpleFacetedSearch을 사용한다.) 즉 고유 값 당 히트 수를 원한다.

현재 추가 텍스트 필드에 값의 복사본을 저장하고 있으며이 텍스트 필드에 대해면 처리 된 검색을 실행합니다. 올바른 결과를 반환합니다.

그러나이 방법이 있습니까? NumericFields를 통한면 처리 된 검색을 수행하는 특별한 방법이 있습니까?

참고 : 카디널리티가 낮기 때문에 precision-step을 int.MaxValue로 설정하여 값당 단 하나의 용어 만 사용할 수 있습니다. 이 경우 숫자 필드 자체에서면 처리 된 검색을 간단히 수행하고 NumericUtils.PrefixCodedToInt()을 사용하여 수동으로 값을 디코딩 할 수 있다고 가정합니다. 이것이 맞습니까, 아니면 합병증이 있습니까? 지금까지의 테스트에서 정상적으로 작동하는 것으로 나타났습니다.

답변

0

별도의 필드에 패싯 값을 저장하면 논리가 들립니다. 숫자 필드는 수정 된 값으로 생각할 수 있습니다. 문자열 필드에는 형태소 분석 및 동의어 확장이 적용될 수 있습니다. 이러한 경우에는 검색을위한 필드 하나와 패싯을위한 필드 하나만 있으면됩니다.

맹 글링 된 필드 (NumericField에서 생성)에서 패싯을 계산할 수 있으며 설명대로 PrefixCodedToInt을 호출하고 같은 결과를 얻을 수 있습니다. 이렇게하면 인덱스 크기가 줄어들 수 있습니다 (숫자 값을 저장할 필요가 없으며 별도로 인덱스 할 필요가 없습니다). 또한 하드 드라이브에서 문서를 찾는 대신 용어 색인에서 값을 읽을 수 있기 때문에 io로드가 줄어들지 만 인덱스 크기, 파일 시스템 캐시 등에 따라 많이 달라집니다.