2016-07-29 2 views
0

Lucene 5.3을 사용하여 문서 집합을 인덱싱하고 BooleanQuery을 사용합니다. 여기서 쿼리의 각 용어는 몇 가지 점수로 향상됩니다.lucene이 색인의 모든 문서를 반환하지 않는 이유는 무엇입니까?

제 문제는 인덱스를 검색 할 때 내 색인에있는 것보다 적은 수의 문서를 얻는 것입니다.

System.out.println("docs in the index = " + reader.numDocs()); 
    //e.g., docs in the index = 92 
    TopDocs topDocs = indexSearcher.search(q, reader.numDocs()); //this ensures no result is omitted from the search. 
    ScoreDoc[] hits = topDocs.scoreDocs; 
    System.out.println("results found: " + topDocs.totalHits) 
    //e.g., results found: 44 

이 동작의 이유는 무엇입니까? lucene은 점수가 0 인 문서를 무시합니까?

점수에 관계없이 색인의 모든 문서를 얻으려면 어떻게해야합니까?

+0

이 쿼리는 색인의 모든 문서와 일치 할 것으로 기대합니까? 또는 쿼리와 일치하는지 여부와 상관없이 모든 문서를 반환하겠습니까? – femtoRgon

+0

모든 문서를 반환하고 싶습니다. 그런 다음 점수에 따라 점수를 매길 것이므로 일치하지 않는 문서가 맨 아래에 표시됩니다. – KillBill

+0

@KillBill IndexSearcher :: search의 코드를 보면 maxScore를 기준으로 문서를 반환하지 않을 가능성이 있습니다. 새 TopDocs를 반환합니다 (totalHits, scoreDocs, maxScore). 그래서 TopDocs searchAfter (ScoreDoc, Query query, int n)를 사용합니다. –

답변

0

Lucene은 실제로 쿼리와 일치하는 결과 만 반환합니다. 모든 문서를 결과로 가져 오려면 모든 문서가 일치하는지 확인해야합니다. MatchAllDocsQuery :

Query query = new BooleanQuery.Builder() 
     .add(new BooleanClause(new MatchAllDocsQuery(), BooleanClause.Occur.MUST)) 
     .add(new BooleanClause(myOldQuery, BooleanClause.Occur.SHOULD)) 
     .build(); 
+0

시험해보고 – KillBill

+0

업데이트 해 드리겠습니다. 그러나 나는 내가이 2 개의 풍경을 잘 해석한다고 생각하지 않는다. lucene은 쿼리가 문서와 일치하는지 여부를 어떻게 결정합니까? 그것은 유사성 점수에 근거한 것인가? 그렇다면 이전 사례에서 lucene은 임계 값을 초과하는 문서 만 반환하는 경우 임계 값을 어떻게 결정합니까? – KillBill

+0

@KillBill - 역 색인에서 일치하는 항목을 찾습니다. 해시 테이블의 작동 방식과 비슷합니다. 일반적으로 주어진 검색에서 색인에있는 대부분의 용어 (또는 문서)를 만질 필요는 없습니다. – femtoRgon

관련 문제