我正在使用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();
}
}
}
答案 0 :(得分:2)
在Schemaless mode中运行Solr Collection时,字段类型(double,integer,string等)将通过添加到字段名称的后缀来获取。 或者通过猜测字段类型,可以使用Boolean,Integer,Long,Float,Double和Date的解析器(不是字符串)。
Schemaless Mode是一组Solr功能,当它们一起使用时, 允许用户通过简单快速构建有效的模式 索引样本数据,而无需手动编辑架构。 这些Solr功能都通过solrconfig.xml控制,它们是:
- 管理 schema:模式修改在运行时通过Solr API进行, 这需要使用支持这些更改的schemaFactory - 有关详细信息,请参阅Schema Factory Definition in SolrConfig。
- 字段 价值类猜测:以前看不见的字段是通过a运行的 级联的基于值的解析器集,它猜测Java类 字段值 - Boolean,Integer,Long,Float,Double和的解析器 日期目前可用。
- 基于自动架构字段添加 on field value class(es):以前看不见的字段被添加到 schema,基于字段值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"/>