`
mozhenghua
  • 浏览: 325445 次
  • 性别: 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的发生真是验证了那句话,牵一发而动全身呀,对代码我们应该有敬畏之心。

分享到:
评论

相关推荐

    ikanalyzer-solr8.4.0_solr8_solr_ikanalyzer_中文分词_

    3. **配置Schema.xml**:在 Solr 的 schema.xml 文件中,我们需要定义字段类型(FieldType)并指定使用 ikanalyzer。例如,可以创建一个名为 `text_ik` 的字段类型,并设置其`analyzer_class`属性为 `org.apache....

    ikanalyzer-solr5

    &lt;fieldType name="text_ikanalyzer" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; &lt;tokenizer class="org.apache.lucene.analysis.cn.ikanalyzer.IKAnalyzer"/&gt; &lt;/analyzer&gt; ...

    solr中文分词jar包ik-analyzer 含class配置 ik-analyzer-7.5.0

    2. **配置Solr schema.xml**:在Solr的schema.xml文件中,定义字段类型(fieldType),并指定使用Ik Analyzer。例如: ```xml &lt;fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"&gt; ...

    Solr6.0集成IK-Analyzer分词器

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

    Solr配置安装(二)--之中文分语器IKAnalyzer

    总之,IKAnalyzer是Solr处理中文文本不可或缺的一部分,通过合理的配置和使用,可以显著提升中文搜索的性能和用户体验。对于开发者来说,理解和掌握IKAnalyzer的配置与使用,是提升Solr系统中文处理能力的关键步骤。

    solr 中文分词其IKAnalyzer 支持solr版本5.X-7.X

    2. **配置schema.xml**:在Solr的配置文件`schema.xml`中,定义字段类型(fieldType)并指定使用IKAnalyzer。例如: ```xml &lt;fieldType name="text_ik" class="solr.TextField"&gt; &lt;analyzer type="index"&gt; ...

    solr6.x的IKAnalyzer整合

    打开 `configsets/_default/conf/schema.xml` 文件,找到 `&lt;fields&gt;` 部分,添加一个新的字段类型(fieldType)用于使用 IKAnalyzer,例如: ```xml &lt;fieldType name="text_ik" class="solr.TextField" ...

    k-analyzer-solr solr分词器

    &lt;fieldType name="text_kanalyzer" class="solr.TextField"&gt; &lt;analyzer type="index"&gt; &lt;/analyzer&gt; &lt;analyzer type="query"&gt; &lt;/analyzer&gt; &lt;/fieldType&gt; ``` 其中,`tokenizer`和`filter`类需要替换...

    IKAnalyzer 适用 lucene和solr 5.4.0版本(新)

    2. **修改 Schema.xml**:在 Solr 的配置文件 Schema.xml 中,定义字段类型(fieldType),指定使用 IKAnalyzer 分词器。 3. **定制词典**:根据业务需求,可以自定义词典,将新词或特定词汇加入到 IKAnalyzer 的...

    solr6.x的IKAnalyzer配置智能分词

    &lt;fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; &lt;/analyzer&gt; &lt;analyzer type="query"&gt; &lt;/analyzer&gt; &lt;/fieldType&gt; ``` - **添加词典**:IK...

    solr7.x ikanalyzer pinyin 分词

    2. 在 Solr 的 schema.xml 文件中定义一个字段类型(field type),指定使用 Ikanalyzer 并启用拼音分词。 3. 创建一个字段(field),使用之前定义的字段类型,以便在该字段上应用 Ikanalyzer 和拼音分词。 4. 重新...

    ik_analyzer中文分析器solr6版及以下版本适用

    2. **配置schema.xml**:在Solr的schema.xml文件中定义字段类型(fieldType),并指定使用ikAnalyzer。例如: ```xml &lt;fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer ...

    ik-analyzer-solr7.x.zip

    &lt;fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; &lt;/analyzer&gt; &lt;analyzer type="query"&gt; &lt;/analyzer&gt; &lt;/fieldType&gt; ``` 这里,`指定了使用IK ...

    ikanalyzer-solr6.zip

    配置`&lt;fieldType&gt;`标签,设置`class`为`solr.TextField`,并在`&lt;analyzer&gt;`部分引用之前在`solrconfig.xml`中定义的Analyzer。 4. **字段定义**:接着,为文档的各个字段指定使用这个新定义的字段类型,例如`&lt;field...

    solr6.0以上版本可以配置的IKAnalyzer分词器

    3. **配置schema.xml**:打开Solr的`conf/schema.xml`文件,我们需要为需要分词的字段定义一个`&lt;fieldType&gt;`,并指定使用IKAnalyzer。例如: ```xml &lt;fieldType name="text_ik" class="solr.TextField" ...

    IK分词solr5.0.0

    2. **修改schema.xml**:在Solr的配置文件schema.xml中,我们需要定义一个或多个字段类型(fieldType),并指定使用IK分词器。例如,可以创建一个名为`text_ik`的字段类型,配置如下: ```xml &lt;fieldType name=...

    solr4.7服务搭建

    &lt;fieldType name="textComplex" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer&gt; &lt;tokenizer class="com.chenlb.mmseg4j.solr.MMSegTokenizerFactory" mode="complex" dicPath="dic"/&gt; ...

    支持solr5.5 solr6.0中IK分词需要的资料

    &lt;fieldType name="text_ik" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; &lt;tokenizer class="org.wltea.analyzer.lucene.IKAnalyzer"/&gt; &lt;/analyzer&gt; &lt;analyzer type="query"&gt; ...

    IKAnalyzer分词及solr4103配置说明

    &lt;fieldType name="text_ik" class="solr.TextField"&gt; &lt;analyzer type="index"&gt; &lt;/analyzer&gt; &lt;analyzer type="query"&gt; &lt;/analyzer&gt; &lt;/fieldType&gt; ``` 4. **配置字段**:为需要使用IKAnalyzer的字段指定...

    solr中文分词高版本

    &lt;fieldType name="text_ikanalyzer" class="solr.TextField" positionIncrementGap="100"&gt; &lt;analyzer type="index"&gt; &lt;tokenizer class="org.apache.lucene.analysis.cn.ikanalyzer.IKAnalyzer"/&gt; &lt;/analyzer&gt; ...

Global site tag (gtag.js) - Google Analytics