0

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)Weightscorer()

scorer.score() :
Scorer.java は DocIdSetIterator.javaを継承するDocsEnum.javaを継承します
スコアラーは関数を使用していnextDoc()ます。これは、関連するドキュメントを決定する関数だと思います(つまり、ドキュメントをクエリに一致させます)。DocIdSetIteratorしかし、この関数も(92行目)で宣言された抽象関数です。繰り返しになりますが、IndexSearcher が使用しているこの関数はどこで定義されているのでしょうか?

Lucene は多くの検索モデル (Vector Space、Language、Okapi BM25) をサポートし、複数のタイプのクエリをサポートします。そのため、モデルとクエリのタイプを選択すると、選択に応じてこれらの関数が定義される可能性があります。しかし、私の SearchFiles.py のコードでは、使用しているクエリとモデルのタイプを選択していません。したがって、Lucene はいくつかのデフォルトの選択を行う必要があります。しかし、私が理解できないのは、これらのデフォルトのシックがどこで作成され、IndexSearcher がこれらの関数を使用するように IndexSearcher コードにどのように含まれているのかということです。

4

1 に答える 1

0

Weightから渡されQuery、クエリのタイプに大きく依存します。TermQueryたとえば、ATermWeightは、 のネストされたクラスである a を返します。これTermQueryは一般的なパターンのようです。ここでのスコアラーは重みから渡されるため、クエリに使用される重みの実装に依存します。ATermWeightは予想通り a を返しますTermScorer

于 2013-07-23T17:26:01.597 に答える