1

Lucene を使用してソース コードのインデックスを作成したいと考えています。ソース コードは、コンパイラ プラグインを使用して事前に分析されています。コンパイラの出力は、ソース コードに表示される ID のリストです。各 ID には、次の情報が含まれています。

  • ID が定義されたモジュール (使用されているのではなく)、
  • ID が表示されるソース スパン (つまり、line:col-line:col)、および
  • ID がこの場所で定義されているか、単にここで使用されているか。

たとえば、このソース コード モジュール (疑似コード) が与えられた場合

module MyModule
from MyOtherModule import bar
foo = ...
print bar

コンパイル時にコンパイラが出力する可能性のあるものは次のMyModuleとおりです。

MyModule.foo,3:1-3:3,definition
MyOtherModule.bar,4:7-4:9,use

ソースではそのように表示されない場合でも、出力に表示されるすべての ID が完全修飾されていることに注意してください。これが、コンパイラを使用する理由です。コンパイラを使用すると、純粋なテキストベースの検索よりも正確なコード検索を実行できます。

質問: メタデータ (つまり、完全修飾 ID と、ID が特定の場所で定義または使用されているかどうか) がスコアリング時に利用できるように、上記のコンパイラ出力にインデックスを付けるカスタム トークナイザーとアナライザーを作成することは可能ですか?書類?

より正確には、各用語をそれが定義されたモジュールに関連付けたいと思います (たとえば、関連付けられたfooメタデータ: module= を定義しますMyModule)。投稿リスト内の各投稿に、この特定の ID の外観がその ID の定義または使用であったかどうかを格納する必要があります。

また、非修飾 ID を修飾 ID のシノニムとして Lucene に保存してもらいたいです。これにより、ユーザーは「foo」を検索し、ID「Module1.foo」および「Module2.foo」を含むすべてのドキュメントを取得できます。

4

1 に答える 1

2

次のようにクエリできるように、さまざまな属性を Lucene フィールドに入れる方がおそらく簡単です。

parse module:MyModule use:yes

これは、「parse」が定義されているのではなく使用されている「MyModule」の「parse」でのみヒットを返します。

于 2014-01-21T23:22:07.663 に答える