首页 > 解决方案 > SolrJ如何更改注释定义的字段的字段类型?

问题描述

我按照 Solr指南创建了一个类,并在类属性前面使用了 @Field 注释。

public class MyDocument {

@Field
public String fra_contents;
... // Other fields
//NO getters and setters as shown https://lucene.apache.org/solr/guide/7_2/using-solrj.html#java-object-binding

}

查看生成的“managed-schema.xml”表明“fra_contents”属于“text_general”类型:

<field name="fra_contents" type="text_general"/>

然而,我需要对该字段应用不同的标记器和不同的过滤器,而不是与“text_general”关联的过滤器。所以我以编程方式创建了一个名为“fra_contents_type”的字段类型(基于Solr 测试代码):

<fieldType name="fra_contents_type" class="solr.TextField">
<analyzer type="index">
  <tokenizer class="solr.ClassicTokenizerFactory"/>
  <filter class="solr.KeywordRepeatFilterFactory"/>
  <filter class="solr.SynonymGraphFilterFactory" synonyms="lang/fra.txt"/>
  <filter class="solr.FlattenGraphFilterFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.ElisionFilterFactory" articles="lang/contractions_fr.txt"/>
  <filter class="solr.SnowballPorterFilterFactory" language="French"/>
  <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
  <tokenizer class="solr.ClassicTokenizerFactory"/>
  <filter class="solr.KeywordRepeatFilterFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.ElisionFilterFactory" articles="lang/contractions_fr.txt"/>
  <filter class="solr.SnowballPorterFilterFactory" language="French"/>
  <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>

This other SO question解释了如何根据java变量类型设置字段类型,但没有说明如何更改此默认字段类型。

那么如何在保留注释的同时以编程方式更改该字段的字段类型(即不编辑“managed-schema.xml”)?

任何帮助表示赞赏,

标签: solrj

解决方案


所以这就是我发现的使用Schema API的后验而不是先验

 // First retrieves the original field attributes
    SchemaRequest.Field originalField = new SchemaRequest.Field(fieldName);
    Map<String, Object> updatedFieldAttributes = originalField.process(
            getSolrClient()).getField();

    // Modifies the original attributes
    updatedFieldAttributes.put("type",
            fieldTypeName);

    // Updates the field type of the field
    SchemaRequest.ReplaceField replaceFieldRequest = new 
    SchemaRequest.ReplaceField(updatedFieldAttributes);

    // Processes the requests
    List<SchemaRequest.Update> list = new ArrayList<>(3);
    list.add(addFieldTypeRequest);
    list.add(replaceFieldRequest);
    SchemaRequest.MultiUpdate multiUpdateRequest = new SchemaRequest.MultiUpdate(
            list);
    SchemaResponse.UpdateResponse multipleUpdatesResponse = multiUpdateRequest.process(
            getSolrClient());

可能有一种更清洁的方式(又名“一个班轮”;-))来做到这一点!


推荐阅读