solr multivalue的实现分析

线上业务准备使用solr做数据存放和索引的功能,其中有的字段要求会存入多个字,solr的field的multivalue可以实现这个功能。

<dynamicFieldname=”*_ss”type=”string”indexed=”true”stored=”true”multiValued=”true”/>

下面看看其实现原理:和solr的写入document相关的两个类是SolrInputDocument 和SolrInputField,其中SolrInputDocument 是和整条document有关,SolrInputField 是和field相关(属性包含field的名称,值和boost值)。SolrInputDocument 类中和document添加的方法主要有addField 和setField,其中setField是覆盖前面的value,addField是追加value.看看其具体实现:

publicSolrInputDocument(){_fields=newLinkedHashMap<String,SolrInputField>();//通过构造方法构建一个map,value是SolrInputField}privatefinalMap<String,SolrInputField>_fields;publicvoidaddField(Stringname,Objectvalue,floatboost)//addFiled的方法中,参数value是个objectSolrInputFieldfield=_fields.get(name);//name是指field的名称,value是指field的值,判断map中是否已经有这个field的信息if(field==null||field.value==null){//如果filed或者filedvalue为空,就用本类的setField(即第一次添加有效地值,类似于overwrite)setField(name,value,boost);}else{field.addValue(value,boost);//否则用SolrInputField的addValue方法(类似于append)}}

其中setField的实现如下:

publicvoidsetField(Stringname,Objectvalue,floatboost){SolrInputFieldfield=newSolrInputField(name);_fields.put(name,field);field.setValue(value,boost);//其实是调用了SolrInputField的setValue方法}

再来看看SolrInputField类:

publicclassSolrInputFieldimplementsIterable<Object>,Serializable{Stringname;Objectvalue=null;floatboost=1.0f;publicSolrInputField(Stringn){this.name=n;}publicvoidsetValue(Objectv,floatb){boost=b;if(vinstanceofObject[]){//Arrayswillbeconvertedtoacollection.如果传入的value是个list,,会转换为collectionObject[]arr=(Object[])v;Collection<Object>c=newArrayList<Object>(arr.length);for(Objecto:arr){c.add(o);}value=c;}else{value=v;}}publicvoidaddValue(Objectv,floatb){//可以看到同样会判断是否为collectionif(value==null){if(vinstanceofCollection){Collection<Object>c=newArrayList<Object>(3);for(Objecto:(Collection<Object>)v){c.add(o);}setValue(c,b);}else{setValue(v,b);}return;}

…. 通过上面可以看出,在向field传入value的时候,是可以传入数组这种数据结构的,这样,就可以在一个field里面插入多个value比如下面的两种方法,都可以写入同一个field多个有效值:例1:

SolrInputDocumentdoc=newSolrInputDocument();Stringkey=”123″;doc.addField(“id”,key);doc.addField(“test_ss”,”vv1″);doc.addField(“test_ss”,”vv2″);doc.addField(“test_ss”,”vv3″);自己喜欢的人,那就随便怎么样了,

solr multivalue的实现分析

相关文章:

你感兴趣的文章:

标签云: