文件索引
文件索引
文件索引基于Map/Reduce 的数据结构。每一个索引都有一个指定类型的key,一个指定类型的value.
示例:word索引中,key就是word自己。value是跟key关联的,包含了word的context的对象(code, string literal, 或 comment)
在索引中,如果获取索引中某key的value的 type 等于 Void ,则表示不存在跟key相关的数据。
当一个索引实现类对一个文件创建了索引,那么这个索引实现类会收到该文件的内容,并返回一个Map, Map包含了该文件的索引key,及跟key相关的value
访问索引的时候,传入key,就能获取到跟key相关的所有文件。
提示
某些情况,可以不使用索引,而使用 Gist
实现文件索引
提示
UI Designer bound forms index 是一个相对简单的索引示例,它存储了 GUI Designer .form中使用的class的全限定命令
注册索引实现类,如下:
<!--在plugin.xml里注册索引实现类-->
<extensions defaultExtensionNs="com.intellij">
<fileBasedIndex implementation="com.intellij.util.indexing.FileBasedIndexExtension 的子类"></fileBasedIndex>
</extensions>
实现 com.intellij.util.indexing.FileBasedIndexExtension 分为以下几部分:
getIndexer() :返回 DataIndexer ,它负责根据文件内容构建索引。
getKeyDescriptor() :返回以二进制的格式存储key的 KeyDescriptor ,最常用的是 KeyDescriptor的子类 EnumeratorStringDescriptor ,它能提升存储效率。
getValueExternalizer() :返回以二进制格式存储value的 DataExternalizer
getInputFilter() :只过滤自己需要的文件。可以使用 DefaultFileTypeSpecificInputFilter
getName() :返回唯一的索引ID,推荐使用类的全限定命名,防止冲突,例如可以使用:com.example.myplugin.indexing.MyIndex
getVersion() :索引的版本。如果当前使用的索引版本和实现类的版本不一致,将会自动重新构建索引
如果获取到的value的type 等于 Void ,则表示不存在该文件。
通过继承 ScalarIndexExtension 可以实现简单的索引。如果索引的Value只有一个,可以继承 SingleEntryFileBasedIndexExtension 来实现
警告
为了保证相同的Value只存储一个,所有索引Value的实现类必须重写 equals() 和 hashCode() 方法。
通过 DataIndexer.map() 方法返回的数据必须只依赖用户输入的参数,不能依赖任何外部元素,否则,你的索引将不能实时更新
在开发的时候,debug索引时,可以把 intellij.idea.indices.debug/intellij.idea.indices.debug.extra.sanity 设置为true
访问文件索引
提示
注意:在项目处于 Dumb mode 时,不能访问索引
通过FileBasedIndex 来访问文件索引,主要包括以下操作:
- getAllKeys() 和 processAllKeys() 方法可以获取到项目的文件所有的key。可以让 FileBasedIndexExtension.traceKeyHashToVirtualFileMapping() 方法返回 true ,来优化性能
提示
保证能返回最新项目中所有的key,也可能有最新项目中不包含的key(项目更新时,会更新索引,但不会删除老索引)。
getValues() :获取跟Key有关的所有值,但是不包含值所在的文件
getContainingFiles() :获取包括Key的所有文件
processValues() :可以遍历和访问跟Key有关的所有文件
警告
索引不支持嵌套访问,可能会引起死锁。应该先从索引A中获取到所有结果,然后再在索引B中使用索引A的结果。
标准索引
IntelliJ Platform 提供了常用的索引,如下:
Word Index
通常使用 PsiSearchHelper 来访问
File Name Index
FilenameIndex 可以快速的根据文件名称查找文件
File Type Index
FileTypeIndex 可以快速的根据文件类型查找文件
向原有的索引根中添加索引
继承 IndexableSetContributor,并在plugin.xml里注册,如下:
<extensions defaultExtensionNs="com.intellij">
<indexedRootsProvider implementation="com.intellij.util.indexing.IndexableSetContributor 实现类"></indexedRootsProvider>
</extensions>