Я запускаю Solr 5.3.1 и хочу обновить свой индекс Solr, например, «установить поле x в« foo », где поле y равно« * bar ». Но Solr, похоже, не имеет возможности выполнять обновление по запросу. Поэтому я применил код, используя SolrJ, чтобы выполнить это.Solr atomic update удаляет предыдущее обновление
Логика делает запрос к Solr для получения результата, который я хочу обновить, затем используйте Atomic Update (см. http://yonik.com/solr/atomic-updates/) для обновления отдельного документа.
Мой код выглядит
public void updateDocsByQuery(String queryStr, String fieldName, String fieldValue)
throws Exception {
SolrDocumentList docList = fetchDocsByQuery(queryStr, "id" , 5000);
if (!docList.isEmpty()) {
Collection<SolrInputDocument> docs = new ArrayList<>();
for (int i=0; i<docList.size(); i++) {
SolrDocument doc = docList.get(i);
String id = (String) doc.getFieldValue("id");
SolrInputDocument inputDoc = new SolrInputDocument();
inputDoc.addField("id", id);
Map<String, Object> fieldMod = new HashMap<>(1);
fieldMod.put("set", fieldValue);
inputDoc.addField(fieldName, fieldMod);
docs.add(inputDoc);
}
client.add(docs);
client.commit();
}
}
Я получаю очень странное поведение с атомным Update. Только последний документ в docList получает обновления со значением, остальные документы удаляются. Если я снова запустил этот код с другим запросом, документ, который был обновлен в предыдущем запуске, также будет удален, снова будет обновлен только последний документ в списке.
Кто-нибудь понимает это странное поведение?
Моя схема является
<schema name="MySchema" version="1.5">
<fields>
<field name="_version_" type="long" indexed="true" stored="true"/>
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_en" indexed="true" stored="true" multiValued="false" termVectors="true" termPositions="true" termOffsets="true" />
<field name="subject" type="text_en" indexed="true" stored="true"/>
<field name="author" type="text_en" indexed="true" stored="true"/>
<field name="keywords" type="text_en" indexed="true" stored="true"/>
<field name="category" type="text_en" indexed="true" stored="true"/>
<field name="suggested_links" type="string" indexed="true" stored="true" />
<field name="resourcename" type="string" indexed="true" stored="true" docValues="true" />
<field name="resource_names" type="string" indexed="true" stored="true" multiValued="true" docValues="true" />
<field name="content_type" type="string" indexed="true" stored="true" docValues="true"/>
<field name="last_modified" type="date" indexed="true" stored="true"/>
<field name="source_group" type="string" indexed="true" stored="true" />
<!-- Main body of document -->
<field name="content" type="text_en" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
<!-- catchall field, containing all other searchable text fields (implemented via copyField further on in this schema -->
<field name="text" type="text_en" indexed="true" stored="false" multiValued="true" />
<!-- holds Solr dedupe hash code -->
<field name="dedupeSignatureField" type="string" indexed="true" stored="true" multiValued="false" />
<!-- copy fields to search by default in our catch-all field, 'text' -->
<copyField source="title" dest="text"/>
<copyField source="subject" dest="text"/>
<copyField source="author" dest="text"/>
<copyField source="keywords" dest="text"/>
<copyField source="content" dest="text"/>
</fields>
<uniqueKey>id</uniqueKey>
<types>
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
<fieldType name="date" class="solr.TrieDateField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="long" class="solr.TrieLongField" precisionStep="0" positionIncrementGap="0"/>
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="lang/stopwords_en.txt"
/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
</types>
введите код здесь
Вы также можете вставить свою схему? – stephanruhl