无法找到抽象函数的定义

时间:2013-07-23 17:01:47

标签: java lucene pylucene

我必须在Lucene代码中做一些修改。我必须修改与查询术语实际匹配的代码和索引,以便为匹配添加新方案 最初我写了一个代码来使用PyLucene进行搜索。你可以找到它here。很明显,我在IndexSearcher类中进行了修改,因为这是实现实际搜索功能的类。

然后我开始关注代码以更深入地找到要修改的实际代码。以下是我遵循的调用层次结构:

  • 在我的代码中,我在第57行呼叫searcher.search(query, None, 100)。然后我在IndexSearcher代码
  • 中跟踪了它
  • 首先,它在第271行调用public TopDocs search(Query query, Filter filter, int n),在第428行调用protected TopDocs search(Weight weight, ScoreDoc after, int nDocs)
  • 现在在这个函数中,我假设我的代码是单线程的(如在SearchFiles.py中我没有提到做多线程搜索)。所以它在第472行打电话给protected TopDocs search(List<AtomicReaderContext> leaves, Weight weight, ScoreDoc after, int nDocs)
  • 此函数正在创建一个收集器对象,并在第599行调用protected void search(List<AtomicReaderContext> leaves, Weight weight, Collector collector)
  • 现在在这个函数中有两个更相关的函数调用:第613行的Scorer scorer = weight.scorer(ctx, !collector.acceptsDocsOutOfOrder(), true, ctx.reader().getLiveDocs());和第616行的scorer.score(collector);。其中一个函数是选择与查询匹配的文档,这意味着,其中一个是我关注的问题。
  • 然后我遵循了这两个功能但无法找到任何内容,如下所述。

weight.scorer
最初,当在第273行调用的函数createNormalizedWeight(FilteredQuery)中创建Weight对象时,它是从Weight类本身的构造函数创建的,而不是从任何子类创建的。在Weight.javascorer()函数中是一个抽象函数(第113行)。 定义了IndexSearcher使用的函数?

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

由于Lucene支持许多搜索模型(Vector Space,Language,Okapi BM25)并支持多种类型的查询。因此,选择模型类型和查询可能会根据所做的选择来定义这些函数。但是在我的SearchFiles.py代码中,我没有选择任何我使用的查询和模型类型。所以Lucene应该做出一些默认选择。 但我无法理解的是这些默认选择的位置以及它们如何包含在IndexSearcher代码中以便IndexSearcher使用这些函数?

1 个答案:

答案 0 :(得分:0)

WeightQuery传递,并且在很大程度上取决于查询的类型。例如,TermQuery返回TermWeight,这是TermQuery中的嵌套类,这似乎是一种常见模式。由于这里的得分手是从权重中传递出来的,因此它将取决于用于查询的权重的实现。 TermWeight可预测地返回TermScorer