【问题标题】:Unable to find definition of a abstract function找不到抽象函数的定义
【发布时间】:2013-07-23 17:01:47
【问题描述】:

我必须对 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.java 类中,scorer() 函数是一个抽象函数(第 113 行)。 IndexSearcher 使用的是哪个函数?

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

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

【问题讨论】:

    标签: java lucene pylucene


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-04-11
      • 2014-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多