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 的定义还是使用。

此外,我想让 Lucene 将非限定 ID 存储为限定 ID 的同义词。这将允许用户搜索“foo”并检索所有包含 ID“Module1.foo”和“Module2.foo”的文档。

4

1 回答 1

2

将各种属性放入 Lucene 字段可能更容易,这样您就可以进行如下查询:

parse module:MyModule use:yes

这将只返回“MyModule”中“解析”的命中,其中使用了“解析”而不是定义。

于 2014-01-21T23:22:07.663 回答