Lucene コードを変更する必要があります。クエリ用語とインデックスを実際に照合するコードを変更して、新しいスキームを照合に追加する必要があります。
最初に、PyLucene を使用して検索するコードを作成しました。ここで見つけることができます。これは、実際の検索機能を実装するクラスであるため、IndexSearcher クラスに変更を加えたことは明らかです。
次に、コードをたどり、実際に変更するコードを見つけるためにさらに深く掘り下げました。以下は、私が従った呼び出し階層です。
- 私のコードでは、57行目で呼び出しています。次に、 IndexSearcherコード
searcher.search(query, None, 100)
でそれに従いました - まず、428 番線で呼び出し
public TopDocs search(Query query, Filter filter, int n)
ている 271 番線で呼び出しています。protected TopDocs search(Weight weight, ScoreDoc after, int nDocs)
- ここで、この関数では、コードがシングル スレッドであると想定しています (SearchFiles.py のように、マルチスレッド検索を行うことについて言及していません)。
protected TopDocs search(List<AtomicReaderContext> leaves, Weight weight, ScoreDoc after, int nDocs)
そのため、 472 行目で呼び出しています。 - この関数はコレクター オブジェクトを作成し、
protected void search(List<AtomicReaderContext> leaves, Weight weight, Collector collector)
599 行目で呼び出しています。 - この関数には、さらに 2 つの関連する関数呼び出しがあります:
Scorer scorer = weight.scorer(ctx, !collector.acceptsDocsOutOfOrder(), true, ctx.reader().getLiveDocs());
行 613 とscorer.score(collector);
行 616 です。この関数の 1 つは、クエリに一致するドキュメントを選択することです。つまり、そのうちの 1 つは私の関心事です。 - 次に、これらの両方の機能を実行しましたが、以下で説明するものを見つけることができませんでした。
weight.scorer :最初に、Weight オブジェクトが273 行で呼び出され
た関数で作成されたとき、子クラスからではなく、クラス自体のコンストラクターから作成されました。Weight.javaクラスの関数は抽象関数です (113 行目)。IndexSearcher が使用しているこの関数はどこで定義されていますか?createNormalizedWeight(FilteredQuery)
Weight
scorer()
scorer.score() :
Scorer.java は DocIdSetIterator.javaを継承するDocsEnum.javaを継承します。
スコアラーは関数を使用していnextDoc()
ます。これは、関連するドキュメントを決定する関数だと思います(つまり、ドキュメントをクエリに一致させます)。DocIdSetIterator
しかし、この関数も(92行目)で宣言された抽象関数です。繰り返しになりますが、IndexSearcher が使用しているこの関数はどこで定義されているのでしょうか?
Lucene は多くの検索モデル (Vector Space、Language、Okapi BM25) をサポートし、複数のタイプのクエリをサポートします。そのため、モデルとクエリのタイプを選択すると、選択に応じてこれらの関数が定義される可能性があります。しかし、私の SearchFiles.py のコードでは、使用しているクエリとモデルのタイプを選択していません。したがって、Lucene はいくつかのデフォルトの選択を行う必要があります。しかし、私が理解できないのは、これらのデフォルトのシックがどこで作成され、IndexSearcher がこれらの関数を使用するように IndexSearcher コードにどのように含まれているのかということです。