`
mozhenghua
  • 浏览: 318883 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Solr 自定义FieldType Analyzer不生效 问题查找

 
阅读更多

 

  最近做得一个项目,需要实现字段的拼音搜索功能,在schema配置了一个fieldtyp,如下:

  <fieldType name="cn_pinyin" class="solr.TextField" positionIncrementGap="100" 
       autoGeneratePhraseQueries="true"  omitNorms="true" omitPositions="false">  
	<analyzer  type="index">
        <tokenizer class="solr.PatternTokenizerFactory" pattern=",\s*" />
	   <filter class="solr.NGramFilterFactory"  minGramSize="1" maxGramSize="7" />
	   <filter class="solr.StandardFilterFactory"/>
	   <filter class="solr.TrimFilterFactory"/>
	   <filter class="com.dfire.tis.solrextend.fieldtype.pinyin.PinyinTokenFilterFactory" />   
	</analyzer> 
     <analyzer  type="query">
       <tokenizer class="solr.PatternTokenizerFactory" pattern=",\s*" />
	   <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

 在analyzer的index部分配置了tokenizer及一系列filter过滤器来处理输入的字段值,先有逗号分隔成标题单元,然后对每个标题单元进行N元分词,然后对标题单元作左右去除空格,最后使用自定义的PinyinTokenFilterFactory进行中文分词,分词结果为中文和拼音的分词结果,都会生成到term列表中。

 

最后将这段配置发布到线上之后,并没有得到预想的结果。经过实际测试发现连逗号分割的标准PatternTokenizerFactory分词器也没有生效。尝试了好多办法都没有解决,耽搁了好久,最后发现全量build中心的一段代码有问题:

public static IndexWriter createRAMIndexWriter(IndexConf indexConf) 
    throws IOException {   
	 RAMDirectory ramDirectory = new RAMDirectory();

		IndexWriterConfig indexWriterConfig = new IndexWriterConfig(
				new StandardAnalyzer()
		);
		indexWriterConfig.setMaxBufferedDocs(Integer.MAX_VALUE);
		indexWriterConfig
				.setRAMBufferSizeMB(IndexWriterConfig.DISABLE_AUTO_FLUSH);

		indexWriterConfig.setOpenMode(OpenMode.CREATE);
		IndexWriter addWriter = new IndexWriter(ramDirectory,
				indexWriterConfig);
		addWriter.commit();
		return addWriter;
}	

 在build中心的代码中有一个创建indexwriter实例的方法,发生问题的代码是构建IndexWriterConfig实例的代码部分,创建IndexWriterConfig实例的时候在构造函数上新创建了StandardAnalyzer对象,这是发生问题的根源,也就是告诉indexWriter,索引的时候调用到的field的analyzer引用全部都使用标准的StandardAnalyzer对象,所以就解释了之前在schema中配置的cn_pinyin中的analyzer统统没有生效的现象了。

正确的代码应该是这样的:

IndexWriterConfig indexWriterConfig = new IndexWriterConfig(
	schema.getIndexAnalyzer()
);

这样就正确了。

 这次bug的发生真是验证了那句话,牵一发而动全身呀,对代码我们应该有敬畏之心。

分享到:
评论

相关推荐

    支持solr 5.3.0的IKAnalyzer中文分词器

    IKAnalyzer中文分词器本身已经不支持最新的solr 5,集成到solr中分词会报错,这里将解决了solr 5支持问题的最新IK包共享出来,希望能帮到各位! 附上IK在schema.xml中的配置: &lt;fieldType name="text_ik" class=...

    ik-analyzer-solr7.zip

    IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。此包兼容solr7.x

    solr实现电商自定义打分

    通过solr实现电商搜索排名打分,排序,可自定义打分规则

    solr+IK Analyzer

    solr4.10.3+IK Analyzer For Solr4.x 发现资源不太好找,或者比较“贵 ” 自己发一个

    solr自定义评分组件demo.zip

    solr评分 solr自定义评分组件demo.zip

    ikanalyzer-solr8.4.0_solr8_solr_ikanalyzer_中文分词_

    此为solr8的ikanalyzer中文分词包

    solr5 IK-Analyzer中文分词

    solr5 IK-Analyzer中文分词。jar里面有IKAnalyzer.cfg.xml、stopword.dic

    tomcat8.5+solr7+IKAnalyzer5

    tomcat8.5+solr7+IKAnalyzer5, 已经整合IKAnalyzer中文分词, 直接使用即可

    自定义Solr分词器

    自定义的Solr 分词器,可以通过竖线"|"来分词,可以在博客http://blog.csdn.net/jiangchao858/article/details/68954044看到生成过程与使用步骤。

    solr分词器IKAnalyzer

    solr分词器IKAnalyzer,IK Analyzer 2012FF_hf1和schama配置文件

    IKAnalyzer-solr4.x-update.zip

    通过继承Analyzer编写自定义类UseSmartIKAnalyzer和NotUseSmartIKAnalyzer,实现智能分词和最细粒度分词,支持solr4.7通过配置schema.xml实现不同的分词效果 &lt;fieldType name="text_ik" class="solr.TextField"&gt; ...

    solr5.x(含5.4)可用的ikanalyzer中文分词

    &lt;fieldType name="text_ik" class="solr.TextField"&gt; &lt;analyzer type="index"&gt; &lt;tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" /&gt; &lt;/analyzer&gt; &lt;analyzer type="query"&gt; ...

    Solr4.7-IKAnalyzer-分词配置-自定义IKTokenizerFactory

    在做IK分词器与solr过滤器结合是时候遇到一些问题,&lt;tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true"/&gt; 在网上页找了一些jar包或者class,最后找到一个合适的源码,解决了问题。 ...

    solr5.0.0- IKAnalyzer-5.0

    solr5.0.0 所需jar包,包含 IKAnalyzer-5.0 ,solr-analyzer-extra-5.1.0 , solr-dataimportscheduler-1.1.1,solr-dataimporthandler-5.0.0 ,solr-dataimporthandler-extras-5.0.0

    ik-analyzer-solr5-5.x.jar

    ik-analyzer分词器,支持solr5-5.x

    ikanalyzer-solr5

    支持solr5以上的ikanalyzer包和配置文件

    solr6对应的IKAnalyzer分词器

    3. 添加一个中文分词的字段类型(filedType):在solr中,字段类型(fieldType)相当于数据库中的字段类型(`int`、`varchar`...),在`server/solr/RD-Product/conf/managed-schema`中配置如下内容 &lt;!--中文分词器IK ...

Global site tag (gtag.js) - Google Analytics