2013-08-14 2 views
2

Lucene을 매우 일반적인 방식으로 사용하지 않으며 내 질문이 어떻게 의미가 있는지 설명하여 서언하겠습니다. Lucene을 사용하여 구조화 된 레코드에서 검색을 수행합니다. 즉, 인덱싱 된 각 문서는 주어진 집합의 짧은 값을 가진 필드 집합입니다. 각 필드는 분석되고 저장되며, 분석은 일반적으로 3 개를 넘지 않으며 대부분의 경우 단지 1 개의 정규화 된 토큰을 생성합니다. 예를 들어 파일에 대한 경로와 사용자 등급이 1-5 인 두 개의 필드를 각각 저장하는 파일을 상상해보십시오. 경로는 PathHierarchyTokenizer로 토큰 화되며 등급은 그대로 저장됩니다. 우리가Lucene에게 간단하고 평평한 채점을 요청하려면 어떻게해야합니까?

path: "https://stackoverflow.com/a/b/file.txt" 
rating: 3 

같은 문서가 경우에 따라서,이 문서는 해당 경로 필드에 토큰 "/ A", "/ A/B"와 "https://stackoverflow.com/a/b/file.ext"을위한있을 것이다 토큰 "3"을 평가합니다.

"path :/a path :/a/b path : /a/b/different.txt rating : 1"과 같은 검색어에 대해이 문서를 점수를 매기고 2의 값을 얻으십시오. 그 일치.

내 이해와 관찰은 문서의 점수가 다양한 용어 메트릭과 많은 필드가있는 많은 문서에 따라 다르다는 것을 이해했으며, 나는 분명히 간단한 정수 점수를 얻지 못하고 있습니다.

Lucene 점수 문서를 윤곽선이있는 방식으로 만들 수있는 방법이 있습니까? 인덱스에 대해 실행되는 쿼리는 사용자가 생성하지는 않지만 시스템에 의해 작성되며 옵션 필터가 첨부되어 있습니다. 즉, 모두 고정 된 형태의 여러 TermQuerys가 BooleanQuery에 결합되어 퍼지 텍스트 검색과 아무런 관련이 없습니다. 현재 Lucene을 다른 것으로 대체 할 수있는 옵션이 없지만 향후 개발을 위해 제안을 환영합니다.

답변

1

사용할 준비가 된 항목이있을 것입니다. 따라서 대부분의 경우 자신의 득점자를 구현하고 검색 할 때 사용해야합니다. 복잡한 경우에는 play around with queries을 원할 수도 있지만 간단한 케이스의 경우 overwrite DefaultSimilaritytf을 원시 빈도 (해당 문서의 특정 용어 수) 및 기타 모든 구성 요소를 1로 설정하는 것으로 충분해야합니다.

public class MySimilarity extends DefaultSimilarity { 

    @Override 
    public float computeNorm(String field, FieldInvertState state) { 
     return 1; 
    } 

    @Override 
    public float queryNorm(float sumOfSquaredWeights) { 
     return 1; 
    } 

    @Override 
    public float tf(float freq) { 
     return freq; 
    } 

    @Override 
    public float idf(int docFreq, int numDocs) { 
     return 1; 
    } 

    @Override 
    public float coord(int overlap, int maxOverlap) { 
     return 1; 
    } 

} 

그리고 IndexSearcher에 불과 set similarity (참고, 그 tf() 1과 다른 뭔가를 반환하는 유일한 방법입니다).

관련 문제