2017-06-19 62 views
1

我正在使用SolrJ索引POJOs到Solr,並且字符串屬性與數字值正在映射到org.apache.solr.schema.TrieLongField類型,這反過來導致BindingException當我嘗試檢索來自Solr的文件。錯誤的Java到Solr類型映射與Schemaless集合

我的課程在註冊人身上注有@Field,我正在添加文檔client.addBean(object)

以下代碼重現此問題:

public class SolrIndexTest { 
    @Field 
    public Long longField; 
    @Field 
    public String stringField; 

    public static void main(String[] args) { 
     //test core created with the following command 
     //sudo su - solr -c "/opt/solr/bin/solr create -c test -n data_driven_schema_configs" 

     HttpSolrClient client = new HttpSolrClient.Builder("http://localhost:8983/solr/test").build(); 
     client.setParser(new XMLResponseParser()); 

     SolrIndexTest obj1 = new SolrIndexTest(); 
     obj1.longField = 1L; 
     obj1.stringField = "1"; // 1st doc: numeric value 
     SolrIndexTest obj2 = new SolrIndexTest(); 
     obj2.longField = 2L; 
     obj2.stringField = "Text string"; // 2nd doc: text value 

     try { 
      client.addBean(obj1); 
      client.commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     try { 
      client.addBean(obj2); // This line will throw a BindingException 
      client.commit(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 
+1

嘗試添加到您的Posto一個[最小的完整和可覈查的示例](https://stackoverflow.com/help/mcve)您遇到 – freedev

+0

這個問題你還應該添加schema.xml文件 – freedev

+0

沒有schema.xml,我正在使用託管模式 – otonjr

回答

1

當您運行字段類型(雙,整數,字符串,等等),一個Solr的集合中Schemaless mode,採取的是後綴添加到字段名。 或者通過猜測字段類型,Boolean,Integer,Long,Float,Double和Date的解析器當前可用(不是字符串)。

無模式模式是一組的Solr的特徵在於,當一起使用時, 允許用戶通過簡單地 索引樣本數據快速構建的有效模式,而無需手動編輯架構。 這些Solr的功能,通過solrconfig.xml中所有的控制,分別是:

  1. 管理 模式:架構修改在運行時通過Solr的API進行的, 它需要支持這些變化使用的SchemaFactory的 - 看到Schema Factory Definition in SolrConfig爲更多細節。
  2. 場 值類猜測:以前看不到的字段通過 級聯一套基於價值的解析器,其中猜測的Java類的 字段值的運行 - 解析器布爾,整型,長整型,浮點,雙精度和 日期目前可用。
  3. 自動架構字段此外,字段值類(ES)基於 :以前看不到的字段添加到 架構,基於字段值的Java類,其分別對應的模式 字段類型 - 見Solr Field Types

總之,如果你想映射正確的字段類型只是添加正確的後綴:

@Field 
public Long longField_l; // _l stands for long 
@Field 
public String stringField_s; // _s stands for string 

,你會看到預期的結果:

<doc> 
    <long name="longField_l">1</long> 
    <str name="stringField_s">1</str> 
</doc> 
<doc> 
    <long name="longField_l">2</long> 
    <str name="stringField_s">Text string</str> 
</doc> 

,如果你最後打開managed-schema文件,您將看到用於映射類型的動態字段列表。 這裏我抄他們的幾個:

<dynamicField name="*_i" type="int" indexed="true" stored="true"/> 
<dynamicField name="*_s" type="string" indexed="true" stored="true"/> 
<dynamicField name="*_l" type="long" indexed="true" stored="true"/> 
<dynamicField name="*_t" type="text_general" indexed="true" stored="true"/> 
<dynamicField name="*_b" type="boolean" indexed="true" stored="true"/> 
<dynamicField name="*_f" type="float" indexed="true" stored="true"/> 
<dynamicField name="*_d" type="double" indexed="true" stored="true"/> 
<dynamicField name="*_p" type="location" indexed="true" stored="true"/> 
<dynamicField name="*_c" type="currency" indexed="true" stored="true"/>