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)
를 호출에 따라 라인 57searcher.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.java는 DocIdSetIterator.java 상속 DocsEnum.java 상속.
Scorer는 nextDoc()
함수를 사용하고 있는데 이는 관련 문서를 결정하는 함수라고 생각합니다. 즉, 해당 문서를 쿼리와 일치시킵니다. 그러나이 함수는 DocIdSetIterator
(줄 92)에 선언 된 추상 함수입니다. 다시 말해,이 기능은 IndexSearcher가 사용하는 곳에서 정의되어 있습니까?
Lucene은 많은 검색 모델 (Vector Space, Language, Okapi BM25)을 지원하며 여러 유형의 쿼리를 지원합니다. 따라서 모델 및 쿼리 유형을 선택하면 선택한 기능에 따라 이러한 기능이 정의 될 수 있습니다. 그러나 SearchFiles.py 코드에서는 쿼리 및 모델 유형을 선택하지 않았습니다. 그래서 Lucene은 기본 선택을해야합니다. 그러나 내가 이해할 수없는 것은 이러한 기본 코드가 만들어지고 IndexSearcher 코드에이 코드가 어떻게 포함되어 IndexSearcher가 이러한 기능을 사용하는지입니다.