1.solr 如何读取索引
在solrconfig.xml中可以配置solr的索引目录。
<dataDir>${solr.data.dir:./solr/data}</dataDir>
默认是在目录./solr/data,如果使用分布式的话,这个配置要跟主机一致。
如果有存在文件index.properties,则读取index=index.20101102052813,获得指定的索引目录index.20101102052813,只在创建indexSearchers 或者indexwriters时调用。
在这里有个疑问,这个index.properties是什么时候出现的,在solrconfig里没有配置的,难道是因为分布式的时候,主机生成的,然后分发到各个子机上。暂时还没有看到这边的代码 ,不过听上司说是这样的。
2.solr扩展DirectoryFactory插件,以应用自己实现的Directory,比如使用HDFS
solr获取Directory,是由实现抽象类DirectoryFactory的StandardDirectoryFactory (默认),调用open(String path) 方法,而实现类StandardDirectoryFactory
public class StandardDirectoryFactory extends DirectoryFactory {
public Directory open(String path) throws IOException {
return FSDirectory.open(new File(path));
}
}
只是简单地在实现open(String path)中,使用lucene的FSDirectory.open(new File(path));来获取 Directory的引用。
在这里便用户便可以在些扩展自己的实现类,通过继承DirectoryFactory,比如实现内存的索引Directory
public class RAMDictoryFactory extends DirectoryFactory {
public Directory open(String path) throws IOException {
return new RAMDirectory();
}
}
然后在solrconfig.xml上配置扩展的DirectoryFactory
<directoryFactory name="DirectoryFactory" class="com.wole.solr.mySolrExt.RAMDictoryFactory">
Parameters as required by the implementation
</directoryFactory >
这样在初始化SolrCore时就会,调用
private void initDirectoryFactory() {
DirectoryFactory dirFactory;
PluginInfo info = solrConfig.getPluginInfo(DirectoryFactory.class.getName());
if (info != null) {
dirFactory = (DirectoryFactory) getResourceLoader().newInstance(info.className);
dirFactory.init(info.initArgs);
} else {
dirFactory = new StandardDirectoryFactory();
}
// And set it
directoryFactory = dirFactory;
}
从源代码可以看出,默认是不用配置DirectoryFactory的,如果没有配置就使用StandardDirectoryFactory类。