我必须对 Lucene 代码进行一些修改。我必须修改将查询词与索引实际匹配的代码,以添加新的匹配方案。
最初,我编写了一个代码来使用 PyLucene 进行搜索。你可以在这里找到它。从中可以清楚地看出,我在 IndexSearcher 类中进行了修改,因为这是实现实际搜索功能的类。
然后我开始按照代码更深入地找到要修改的实际代码。以下是我遵循的调用层次结构:
- 在我的代码中,我
searcher.search(query, None, 100)
在第 57 行调用。然后我在IndexSearcher代码中跟踪它 - 首先它
public TopDocs search(Query query, Filter filter, int n)
在第 271 行调用,它protected TopDocs search(Weight weight, ScoreDoc after, int nDocs)
在第 428 行调用。 - 现在在这个函数中,我假设我的代码是单线程的(就像在 SearchFiles.py 中我没有提到进行多线程搜索一样)。所以它在第 472 行调用
protected TopDocs search(List<AtomicReaderContext> leaves, Weight weight, ScoreDoc after, int nDocs)
。 - 该函数正在创建一个收集器对象并
protected void search(List<AtomicReaderContext> leaves, Weight weight, Collector collector)
在第 599 行调用。 - 现在在这个函数中有两个更相关的函数调用:
Scorer scorer = weight.scorer(ctx, !collector.acceptsDocsOutOfOrder(), true, ctx.reader().getLiveDocs());
在第 613 行和scorer.score(collector);
第 616 行。这个函数之一是选择与查询匹配的文档,这意味着其中一个是我关心的。 - 然后我遵循了这两个功能,但找不到任何东西,如下所述。
weight.scorer:最初在第 273 行调用
的函数中创建 Weight 对象时,它是从类本身的构造函数创建的,而不是从任何子类创建的。Weight.java类中的函数是一个抽象函数(第 113 行)。这个函数是在哪里定义的 IndexSearcher 正在使用哪个?createNormalizedWeight(FilteredQuery)
Weight
scorer()
scorer.score():
Scorer.java继承DocsEnum.java继承DocIdSetIterator.java。
Scorer 正在使用一个函数nextDoc()
,我认为这是决定相关文档的函数(即,将文档与查询匹配)。但同样,这个函数是在DocIdSetIterator
(第 92 行)中声明的抽象函数。再说一次,这个函数是在哪里定义的,IndexSearcher 正在使用哪个?
由于 Lucene 支持多种搜索模型(向量空间、语言、Okapi BM25)并支持多种类型的查询。因此,选择模型类型和查询可能会根据所做的选择定义这些功能。但是在我的 SearchFiles.py 代码中,我没有选择任何我使用的查询类型和模型。所以 Lucene 应该做出一些默认选择。但我无法理解的是这些默认模式是在哪里制作的,以及它们是如何包含在 IndexSearcher 代码中的,以便 IndexSearcher 使用这些功能?