2017-02-01 21 views
0

Я запускаю 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> 

введите код здесь

+0

Вы также можете вставить свою схему? – stephanruhl

ответ

0

Я также столкнулся с этой проблемой во время работы на Solr 5.4.0. Только последний документ в docList использовался для обновления со значением, остальные документы были удалены.

Мое решение, в вашем коде заменить:

inputDoc.addField("id", id); 

с

inputDoc.setField("id", id); 

Оставьте остальную часть кода нетронутой.

 Смежные вопросы

  • Нет связанных вопросов^_^