SolrJ如何更改注释定义的字段的字段类型?

SolrJ如何更改注释定义的字段的字段类型?,solrj,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

我跟随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”:


然而,我需要对这个字段应用不同的标记器和过滤器,而不是与“text_general”相关联的过滤器。因此,我以编程方式创建了一个名为“fra\U内容\U类型”的fieldtype(以下基于):


解释如何基于java变量类型设置fieldtype,但不说明如何更改此defauld fieldtype

那么,在保留注释(即不编辑“managed schema.xml”)的情况下,如何以编程方式更改此字段的字段类型


感谢您的帮助,

因此,以下是我发现的方法,它是事后有效的,而不是先验的

//首先检索原始字段属性
SchemaRequest.fieldoriginalfield=新SchemaRequest.Field(fieldName);
Map updatedFieldAttributes=originalField.process(
getSolrClient()).getField();
//修改原始属性
updatedFieldAttributes.put(“类型”,
字段类型名称);
//更新字段的字段类型
SchemaRequest.ReplaceField replaceFieldRequest=新建
SchemaRequest.ReplaceField(updatedFieldAttributes);
//处理请求
列表=新的ArrayList(3);
list.add(addFieldTypeRequest);
列表。添加(replaceFieldRequest);
SchemaRequest.multiupdatemultiupdaterequest=新SchemaRequest.MultiUpdate(
名单);
SchemaResponse.UpdateResponse MultipleUpdateResponse=multiUpdateRequest.process(
getSolrClient());
可能有一个更干净的方法(又名“一行”;-)来做到这一点

<field name="fra_contents" type="text_general"/>
<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>
 // 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());