0

我必须对 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)Weightscorer()

scorer.score()
Scorer.java继承DocsEnum.java继承DocIdSetIterator.java
Scorer 正在使用一个函数nextDoc(),我认为这是决定相关文档的函数(即,将文档与查询匹配)。但同样,这个函数是在DocIdSetIterator(第 92 行)中声明的抽象函数。再说一次,这个函数是在哪里定义的,IndexSearcher 正在使用哪个?

由于 Lucene 支持多种搜索模型(向量空间、语言、Okapi BM25)并支持多种类型的查询。因此,选择模型类型和查询可能会根据所做的选择定义这些功能。但是在我的 SearchFiles.py 代码中,我没有选择任何我使用的查询类型和模型。所以 Lucene 应该做出一些默认选择。但我无法理解的是这些默认模式是在哪里制作的,以及它们是如何包含在 IndexSearcher 代码中的,以便 IndexSearcher 使用这些功能?

4

1 回答 1

0

Weight是从 传递过来的Query,很大程度上取决于查询的类型。TermQuery例如,A返回 a TermWeight,它是 中的嵌套类TermQuery,这似乎是一种常见模式。由于这里的记分器是从权重传递的,因此它将取决于用于查询的权重的实现。ATermWeight可预测地返回 a TermScorer

于 2013-07-23T17:26:01.597 回答