according to solr documentation
The core functionality of atomically updating a document requires that all fields in your schema must be configured as stored (stored="true") or docValues (docValues="true") except for fields which are <copyField/
all fields in the schema.xml must be stored. I create two core test_core_1 and test_core_2.
here is test_core_1 schema
<field name="_nest_path_" type="_nest_path_" stored="true"/>
<field name="_root_" type="string" indexed="true" stored="false"/>
<field name="_version_" type="plong" indexed="false" stored="false" docValues="true" useDocValuesAsStored="false" multiValued="false"/>
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
<field name="sender" type="plong" docValues="true" indexed="true" stored="true" multiValued="false"/>
<field name="text" type="text_general" uninvertible="false" omitNorms="false" indexed="true" stored="false" multiValued="false"/>
<field name="name" type="text_general" uninvertible="true" omitNorms="false" indexed="true" stored="false" docValues="false" multiValued="false"/>
<field name="uniqueId" type="text_general" uninvertible="true" omitNorms="false" indexed="true" stored="true" multiValued="false"/>
<field name="type" type="string" uninvertible="true" docValues="true" indexed="true" stored="false" useDocValuesAsStored="false" multiValued="false"/>
<field name="value" type="string" uninvertible="true" docValues="true" indexed="true" stored="false" useDocValuesAsStored="false" multiValued="false" omitNorms="false"/>
<field name="userId" type="plong" uninvertible="true" docValues="true" indexed="true" stored="false" useDocValuesAsStored="false" multiValued="false"/>
and this is test_core_2 schema
<field name="_nest_path_" type="_nest_path_"/>
<field name="_root_" type="string" docValues="false" indexed="true" stored="false"/>
<field name="_version_" type="plong" indexed="false" stored="false"/>
<field name="id" type="string" multiValued="false" indexed="true" required="true" stored="true"/>
<field name="sender" type="plong" docValues="true" indexed="true" stored="true" multiValued="false"/>
<field name="text" type="text_general" uninvertible="false" omitNorms="false" indexed="true" stored="false" multiValued="false"/>
<field name="name" type="text_general" uninvertible="true" omitNorms="false" indexed="true" stored="false" docValues="false" multiValued="false"/>
<field name="uniqueId" type="text_general" uninvertible="true" omitNorms="false" indexed="true" stored="true" multiValued="false"/>
<field name="type" type="string" uninvertible="true" docValues="true" indexed="true" stored="false" useDocValuesAsStored="false" multiValued="false"/>
<field name="value" type="string" uninvertible="true" docValues="true" indexed="true" stored="false" useDocValuesAsStored="false" multiValued="false" omitNorms="false"/>
<field name="userId" type="plong" uninvertible="true" docValues="true" indexed="true" stored="false" useDocValuesAsStored="false" multiValued="false"/>
I can update just the name field in the first core (test_core_1) but for the second core, I got an error.
as we can see I have non-stored and non-docValues field like name in the schema in both core and the differences are related to nest_path, version, and root. so how is it possible I can update the name (I mean Updating Parts of Documents Or Atomic update) in the first core but I got this error from the second core.
Error from server at http://localhost:8983/solr: This schema does not support partial updates to nested docs. See ref guide.
according to documentation, I must get error from both of them, I am confused about this subject in solr. can anybody explain it?
this is my code
SolrInputDocument document = new SolrInputDocument();
document.setField("id", String.valueOf(id));
document.setField("sender", id * 2);
document.setField("text", "sampleText" + id);
document.setField("name", "saba" + "safavi" + id);
document.setField("uniqueId", "test" + id + DateUtil.getNowDate().getTime());
List<Map<String, Object>> list = new ArrayList<>();
Map<String, Object> obj;
for (int i = 0; i < 10; i++) {
obj = new HashMap<>();
obj.put("type", "type" + i);
obj.put("value", "value" + i);
obj.put("userId", i);
list.add(obj);
}
List<SolrInputDocument> metadataDocumentList = new ArrayList<>();
for (Map<String, Object> stringObjectMap : list) {
SolrInputDocument metadataDoc = new SolrInputDocument();
for (Map.Entry<String, Object> stringObjectEntry : stringObjectMap.entrySet()) {
metadataDoc.addField(stringObjectEntry.getKey(), stringObjectEntry.getValue());
}
metadataDocumentList.add(metadataDoc);
}
document.addField("meta", metadataDocumentList);
try {
UpdateResponse response = solrClient.add("test_core_2", document);
// UpdateResponse response = solrClient.add("test_core_1", document);
solrClient.commit("test_core_2");
// solrClient.commit("test_core_1");
} catch (SolrServerException | IOException e) {
logger.error("error occured in add or update document solr.", e);
}
SolrInputDocument solrDocument = new SolrInputDocument();
solrDocument.addField("id", "20");
Map<String, Object> fieldModifier = new HashMap<>();
fieldModifier.put("set", "sabaNew20");
solrDocument.addField("name", fieldModifier);
try {
UpdateResponse response = solrClient.add("test_core_1", solrDocument);
solrClient.commit("test_core_1");
} catch (SolrServerException | IOException e) {
logger.error("error occurred in delete message #",e);
}