solr支持三种类型的原子更新:
- set - to set a field.
- add - to add to a multi-valued field.
- inc - to increment a field.
其中set可以是单值的也可以是multifiled, add 针对multi-field ,inc 对应数值类型
使用solrj进行原子更新
String zk= "127.0.0.1:2183";
String root="/solr";
CloudSolrClient solrClient=new CloudSolrClient(zk+root);
solrClient.connect();
SolrInputDocument doc = new SolrInputDocument();
Map<String, String> partialUpdate = new HashMap<String, String>();
partialUpdate.put("set", "纯植物染发1次男女不限仅限短发,提供免费WiFi");
doc.addField("grouponId", "123456");
doc.addField("name", partialUpdate);
Map<String,List<String>> cities=new HashMap<String, List<String>>();
List list=new ArrayList();
list.add("北京");
list.add("长春");
cities.put("set",list);
doc.addField("city",cities);
doc.addField("_version_",1);
Map<String,String> subCat=new HashMap<String, String>();
subCat.put("add","美容");
doc.addField("subCat",subCat);
Map<String,Long> price=new HashMap<String, Long>();
price.put("inc",100L);
doc.addField("price",price);
try {
solrClient.add("groupon",doc);
solrClient.commit("groupon");
} catch (SolrServerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
solrClient.close();
} catch (IOException e) {
e.printStackTrace();
}
原始数据:
{
grouponId: "123456",
cat: [
"丽人"
],
subCat: [
"美发"
],
name: "纯植物染发1次男女不限仅限短发,提供免费WiFi1",
price: 67.80000305175781,
startTime: "2015-08-31T06:16:35Z",
endTime: "2016-06-25T15:59:59Z",
postTime: "2015-11-04T10:25:33.914Z",
city: [
"北京市",
"长春市"
],
region: [
"新郑市"
],
district: [
"炎黄广场"
],
_version_: 1535465635791765500
}
执行代码后:
{
grouponId: "123456",
cat: [
"丽人"
],
subCat: [
"美发",
"美容"
],
name: "纯植物染发1次男女不限仅限短发,提供免费WiFi",
price: 167.8000030517578,
startTime: "2015-08-31T06:16:35Z",
endTime: "2016-06-25T15:59:59Z",
postTime: "2015-11-04T10:25:33.914Z",
city: [
"北京",
"长春"
],
region: [
"新郑市"
],
district: [
"炎黄广场"
],
_version_: 1535467687828783000
}
关于更新中传入的_version_值说明:
- version<0,如果这个文档存在,则solr会拒绝修改,如果不存在,则add这个文档
- 当version=0时,如果待修改的文档存在,则修改这个文档,如果不存在。则add这个文档
- version=1 ,如果文档存在,则update这个文档,如果不存在,则拒绝修改,
- version>1, 如果文档的_version_值和传入的version值不一样,则拒绝修改,值一样则修改。
原子更新的几点问题:
- 如果有字段的store=false,但是在更新的时候没有给这个字段设置值,则这个字段在更新的时候数据会被丢掉; store=true的字段则不会。
- 针对multi-field字段,如果store=false, 则在原子更新 使用add时也会把这个字段之前的数据丢掉。