나는 Lucene 지수 내에서 상위 용어를 얻을 수있는 가능성을 알고 있지만, Lucene 인덱스의 하위 세트를 기반으로 상위 용어를 얻는 방법이 있습니까?Lucene 색인에서 문서의 하위 집합에 대한 상위 용어를 얻으려면 어떻게합니까?
e.e. 특정 기간 내의 문서에 대한 색인의 상위 용어는 무엇입니까?
나는 Lucene 지수 내에서 상위 용어를 얻을 수있는 가능성을 알고 있지만, Lucene 인덱스의 하위 세트를 기반으로 상위 용어를 얻는 방법이 있습니까?Lucene 색인에서 문서의 하위 집합에 대한 상위 용어를 얻으려면 어떻게합니까?
e.e. 특정 기간 내의 문서에 대한 색인의 상위 용어는 무엇입니까?
이상적으로 유틸리티를 사용할 수있는 유틸리티가 있지만 이상하지는 않습니다. 그러나 합리적으로 효율적인 방법으로 이것을 "손으로"하는 것은 그리 어렵지 않습니다. 관심있는 하위 집합을 정의하는 데 사용할 수있는 Query
및/또는 개체가 이미 있다고 가정합니다.
먼저 색인 하위 집합에있는 모든 문서 ID의 목록을 작성하십시오. IndexSearcher.search(Query, Filter, HitCollector)
을 사용하면이 작업을 매우 빠르게 수행 할 수 있습니다. HitCollector
documentation에는 작동해야하는 것처럼 보이는 예제가 포함되어 있거나 다른 컨테이너를 사용하여 문서 ID를 저장할 수 있습니다.
다음으로 빈 HashMap (또는 무엇이든)을 초기화하여 용어를 전체 빈도로 매핑하고 모든 문서 및 관심 분야에 대해 IndexReader.getTermFreqVector
방법 중 하나를 호출하여지도를 채 웁니다. 세 가지 인수 형식이 더 단순 해 보이지만 어느 것이 든 괜찮습니다. 3 가지 형식의 양식의 경우 이 frequency
인 경우지도에 포함되어 있는지 map
방법이 확인한 TermVectorMapper
을 만들거나 그렇지 않은 경우 frequency
을 추가합니다. 이 패스에서 에 대한 모든 호출에서 동일한 TermVectorMapper
객체를 사용해야하며 루프의 각 문서에 대해 새 인스턴스를 인스턴스화하는 것이 좋습니다. isIgnoringPositions()
및 isIgnoringOffsets()
을 무시하여 작업 속도를 상당히 높일 수 있습니다. 귀하의 개체는 그 둘 모두에 대해 true
을 반환해야합니다. TermVectorMapper
이 setExpectations
메소드를 강제로 정의 할 수도 있지만 아무 것도 할 필요가없는 것 같습니다.
일단지도를 작성했으면 빈도를 내림으로써지도 항목을 정렬하고 좋아하는 많은 상위 검색어를 읽으십시오. 사전에 얼마나 많은 단어가 필요한지 알고 있다면 멋진 힙 기반 알고리즘을 사용하여 O (n 로그 n) 정렬을 사용하는 대신에 k 항목을 선형 시간으로 찾을 수 있습니다. . 나는 평범한 구식이 실제로는 충분히 빠를 것이라고 상상한다. 그러나 그것은 당신에게 달려 있습니다.
원하는 경우 HitCollector
을 getTermFreqVector
으로 직접 호출하여 처음 두 단계를 결합 할 수 있습니다. 이것은 분명히 똑같이 정확한 결과를 만들어야하며 직관적으로 더 쉽고 간단하게 보이지만 문서는 HitCollector 예제와 같은 페이지에서 두 단계 접근 방법보다 상당히 느릴 수 있다고 경고하는 것 같습니다. 위). 또는 나는 그들의 경고를 잘못 해석 할 수있다. 자신이 야심 차게 느끼는 경우 두 가지 방법을 시도해보고 비교하고 알려주십시오.
TermVectors를 계산하면되지만 반복 할 문서가 많은 경우 속도가 느려집니다. 또한 docFreq를 상위 용어로 사용하는 경우에는 TermFreqVector에서 해당 용어를 2 진수로 계산하지 마십시오.
또는 패싯 개수와 같은 용어를 반복 할 수 있습니다. 매 학기마다 cached filter을 사용하십시오. 그들의 BitSets은 빠른 교차 카운트를 위해 사용될 수 있습니다.
히트가 많은 경우 특히 느려질 수 있습니까? – jjxtra