2013-07-23 3 views
1

Lucene 코드에서 일부 수정을해야합니다. 일치하는 새로운 스키마를 추가하기 위해 쿼리 용어와 인덱스를 실제로 일치시키는 코드를 수정해야합니다.
처음에는 PyLucene을 사용하여 검색 할 코드를 작성했습니다. 당신은 그것을 here 찾을 수 있습니다. 이것으로부터 IndexSearcher 클래스가 실제로 검색 기능을 구현하는 클래스이기 때문에 수정이 있었음이 분명합니다.추상 함수의 정의를 찾을 수 없습니다.

다음 코드를 수정하기 위해 실제 코드를 찾기 위해 더 깊이 들어가기 시작했습니다. 호출 계층 구조에 따라 나는 다음에 내 코드에서

  • 을 내가 그럼 난 라인 (428)에 protected TopDocs search(Weight weight, ScoreDoc after, int nDocs)를 호출 IndexSearcher 코드
  • 첫째 라인 (271)에 public TopDocs search(Query query, Filter filter, int n)를 호출에 따라 라인 57 searcher.search(query, None, 100)를 호출하고
  • 이제는이 함수에서 단일 코드로 가정합니다 (SearchFiles.py에서 멀티 스레드 검색을 수행 할 것을 언급하지 않았습니다). 그래서 그 라인 472
  • 이 기능은 컬렉터 객체를 생성하고이 기능을 지금
  • 라인 599에 protected void search(List<AtomicReaderContext> leaves, Weight weight, Collector collector)를 호출에 protected TopDocs search(List<AtomicReaderContext> leaves, Weight weight, ScoreDoc after, int nDocs)를 호출 두 개 더 관련 함수 호출이 있습니다 : 라인 613에 Scorer scorer = weight.scorer(ctx, !collector.acceptsDocsOutOfOrder(), true, ctx.reader().getLiveDocs());scorer.score(collector); 라인 (616)에. 이 기능 중 하나는 검색어와 일치하는 문서를 선택하는 것입니다. 즉, 그 중 하나가 내 관심사입니다.
  • 다음 두 가지 기능을 모두 수행했지만 아무것도 찾을 수 없습니다. 아래에서 설명합니다.

weight.scorer는 다음 무게 객체가 라인 (273)에 호출 한 함수 createNormalizedWeight(FilteredQuery)에서 생성 될 때
처음에, 그렇지 하위 클래스에서, Weight 클래스 자체의 생성자에서 만들었습니다. Weight.java 클래스에서 scorer() 함수는 추상 함수입니다 (줄 113). 이 기능은 IndexSearcher가 사용하는 곳에 정의되어 있습니까?

scorer.score()는 :
Scorer.javaDocIdSetIterator.java 상속 DocsEnum.java 상속.
Scorer는 nextDoc() 함수를 사용하고 있는데 이는 관련 문서를 결정하는 함수라고 생각합니다. 즉, 해당 문서를 쿼리와 일치시킵니다. 그러나이 함수는 DocIdSetIterator (줄 92)에 선언 된 추상 함수입니다. 다시 말해,이 기능은 IndexSearcher가 사용하는 곳에서 정의되어 있습니까?

Lucene은 많은 검색 모델 (Vector Space, Language, Okapi BM25)을 지원하며 여러 유형의 쿼리를 지원합니다. 따라서 모델 및 쿼리 유형을 선택하면 선택한 기능에 따라 이러한 기능이 정의 될 수 있습니다. 그러나 SearchFiles.py 코드에서는 쿼리 및 모델 유형을 선택하지 않았습니다. 그래서 Lucene은 기본 선택을해야합니다. 그러나 내가 이해할 수없는 것은 이러한 기본 코드가 만들어지고 IndexSearcher 코드에이 코드가 어떻게 포함되어 IndexSearcher가 이러한 기능을 사용하는지입니다.

답변

0

WeightQuery에서 전달되며 쿼리 유형에 따라 크게 달라집니다.예를 들어 TermQueryTermWeight을 반환합니다.이 패턴은 일반적인 패턴 인 TermQuery에 중첩 된 클래스입니다. 여기서 스코어러는 가중치로부터 전달되기 때문에 쿼리에 사용되는 가중치 구현에 따라 달라집니다. TermWeightTermScorer을 예측하여 반환합니다.

관련 문제