使用Schemaless Collection错误的Java到Solr类型映射

时间:2017-06-19 21:26:43

标签: java solr solrj

我正在使用SolrJ将POJO索引到Solr,并且带有数值的字符串属性被映射到org.apache.solr.schema.TrieLongField类型,当我尝试检索文档时,它会导致BindingException来自Solr。

我的班级在设置者上使用@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 个答案:

答案 0 :(得分:2)

Schemaless mode中运行Solr Collection时,字段类型(double,integer,string等)将通过添加到字段名称的后缀来获取。 或者通过猜测字段类型,可以使用Boolean,Integer,Long,Float,Double和Date的解析器(不是字符串)。

  

Schemaless Mode是一组Solr功能,当它们一起使用时,   允许用户通过简单快速构建有效的模式   索引样本数据,而无需手动编辑架构。   这些Solr功能都通过solrconfig.xml控制,它们是:

     
      
  1. 管理   schema:模式修改在运行时通过Solr API进行,   这需要使用支持这些更改的schemaFactory -   有关详细信息,请参阅Schema Factory Definition in SolrConfig
  2.   
  3. 字段   价值类猜测:以前看不见的字段是通过a运行的   级联的基于值的解析器集,它猜测Java类   字段值 - Boolean,Integer,Long,Float,Double和的解析器   日期目前可用。
  4.   
  5. 基于自动架构字段添加   on field value class(es):以前看不见的字段被添加到   schema,基于字段值Java类,映射到模式   字段类型 - 请参阅Solr Field Types
  6.   

简而言之,如果您想要正确地映射您的字段类型,只需添加正确的后缀:

@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"/>