业务场景,并不是我们业务的所有字段都需要在schema.xml、managed-schema指定成固定的字段。
<field name="name" type="string" indexed="true" stored="true"/>、<field name="sex" type="string" indexed="true" stored="true"/>这些都是固定的
例如我现在有一个新业务,大概有5个字段,需要拼接在原来的core里面,那么dynamicField就发挥了它的用武之地了。
直接上代码:
schema.xml、managed-schema文件中的配置如下
<!-- 动态字段 -->
<dynamicField name="solrField_s_*" type="text_general_rev" indexed="true" stored="true"/> 存放String类型
<dynamicField name="solrField_d_*" type="double" indexed="true" stored="true"/> 存放double类型
<dynamicField name="solrField_l_*" type="long" indexed="true" stored="true"/> 存放long类型
<field name="keywords" type="text_general_rev" indexed="true" stored="true" multiValued="true"/>
<copyField source="solrField_*" dest="keywords"/>
java代码:
public static void testAddPerson(){
try{
// 得到请求
SolrClient sc = getSolrClient();
// 拼装文本
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", 1);
doc.addField("solrField_s_1", "1");
doc.addField("solrField_s_2", "2");
doc.addField("solrField_d_1", "2.0");
doc.addField("solrField_l_1", "1239012320");
sc.add(doc);
sc.commit();
} catch (SolrServerException e) {
new SolrUtils().logger.error(e.getMessage());
throw new CenException("solr备注报错");
} catch (IOException e) {
new SolrUtils().logger.error(e.getMessage());
throw new CenException("solr备注报错");
}
}
public static SolrClient getSolrClient() {
String url = "xxxxx";//这里是solr的实例的请求地址
return new HttpSolrClient(url);
}
查询结果:
{
"responseHeader":{
"status":0,
"QTime":135,
"params":{
"q":"*:*",
"indent":"on",
"wt":"json",
"_":"1510043041895"}},
"response":{"numFound":1,"start":0,"docs":[
{
"id":1,
"solrField_s_1":"1",
"keywords":["1",
"2",
"2.0",
"1239012320"],
"solrField_s_2":"2",
"solrField_d_1":2.0,
"solrField_l_1":1239012320,
"_version_":1583395999953453056}]
}}
通过结果可以看出,我的schema.xml里面根本就没配置
solrField_s_1,solrField_s_2,solrField_d_1,solrField_l_1这些字段,但是却能把数据放进去,放进去了,肯定可以根据对应的字段进行查询。