Solr 分词器(analyzer)是怎么传到Luence的
Solr 分词器(analyzer)是怎么传到Luence的
(2011-11-02 17:41:48)if(queryAnalyzer==null)queryAnalyzer=analyzer;
if(analyzer==null)analyzer=queryAnalyzer;
if(analyzer!=null){
ft.setAnalyzer(analyzer);
ft.setQueryAnalyzer(queryAnalyzer);
}
queryAnalyzer为查询时用到的分词器,analyzer为建索引时用到的分词器。从上面可以看出,如果我们没有配查询的分词器,则用创建的分词器,同理,如果创建时的分词器为空,则用查询的分词器。如果两个都为空,就是没有分词器了。
注意,这里的analyzer和queryAnalyzer都是TokenizerChain,里面包含了一个分词器的链。
主要问题是,Solr是在什么时候用到这些分词器的呢,通过调试,发现,Solr是在DirectUpdateHandler2的addDoc(AddUpdateCommandcmd)方法里面的两行代码如下:
synchronized(this){
//addingdocument--prepwriter
openWriter();
tracker.addedDocument(cmd.commitWithin);
}//end
addDoc方法是我们新建索引时调用的。openWriter是打开indexWriter,这里会判断indexWriter是否为空,如果为空则会创建一个createMainIndexWriter实例,代码如下:
if(writer==null){
writer=createMainIndexWriter("DirectUpdateHandler2",false);//这里就是new一个SolrIndexWriter实例
}
createMainIndexWriter方法就是new一个SolrIndexWriter实例,会传一个schema给SolrIndexWriter通过构造函数。
SolrIndexWriter继承luence的IndexWriter,创建indexWriter时会把schema的analyzer传给IndexWriterConfig。
这样luence的indexWriter就分词器就保存在IndexWriterConfig上。