我必须在Lucene代码中做一些修改。我必须修改与查询术语实际匹配的代码和索引,以便为匹配添加新方案 最初我写了一个代码来使用PyLucene进行搜索。你可以找到它here。很明显,我在IndexSearcher类中进行了修改,因为这是实现实际搜索功能的类。
然后我开始关注代码以更深入地找到要修改的实际代码。以下是我遵循的调用层次结构:
searcher.search(query, None, 100)
。然后我在IndexSearcher代码public TopDocs search(Query query, Filter filter, int n)
,在第428行调用protected TopDocs search(Weight weight, ScoreDoc after, int nDocs)
。protected TopDocs search(List<AtomicReaderContext> leaves, Weight weight, ScoreDoc after, int nDocs)
。protected void search(List<AtomicReaderContext> leaves, Weight weight, Collector collector)
。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()
,我认为这是决定相关文档的函数(即将doc与查询匹配)。但同样,这个函数是在DocIdSetIterator
中声明的抽象函数(第92行)。 再次,定义了这个函数,其中IndexSearcher正在使用?
由于Lucene支持许多搜索模型(Vector Space,Language,Okapi BM25)并支持多种类型的查询。因此,选择模型类型和查询可能会根据所做的选择来定义这些函数。但是在我的SearchFiles.py代码中,我没有选择任何我使用的查询和模型类型。所以Lucene应该做出一些默认选择。 但我无法理解的是这些默认选择的位置以及它们如何包含在IndexSearcher代码中以便IndexSearcher使用这些函数?
答案 0 :(得分:0)
Weight
从Query
传递,并且在很大程度上取决于查询的类型。例如,TermQuery
返回TermWeight
,这是TermQuery
中的嵌套类,这似乎是一种常见模式。由于这里的得分手是从权重中传递出来的,因此它将取决于用于查询的权重的实现。 TermWeight
可预测地返回TermScorer
。