Полное обновление Solr не очищает индекс

У меня проблема, когда Solr не очищает индекс во время полного импорта.

На всех серверах работает Solr 3.4, конфигурация настолько ванильна, насколько это возможно.

Я попробовал это в нашей среде разработки и на своем собственном компьютере и получил аналогичные результаты.

Схема довольно проста, вот основные моменты:

<schema name="System" version="1.4">
...
  </types>
    <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" />
    <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0" />
    <fieldType name="date" class="solr.TrieDateField" omitNorms="true" precisionStep="0" positionIncrementGap="0" />
    <fieldType name="documentKey" class="solr.TextField">
      <analyzer type="index"> 
        <tokenizer class="solr.KeywordTokenizerFactory"/> 
      </analyzer> 
      <analyzer type="query"> 
        <tokenizer class="solr.KeywordTokenizerFactory"/> 
      </analyzer> 
    </fieldType>
  </types>
  <fields>
    <field name="document_id" type="documentKey" indexed="true" stored="true" required="true" />
    <field name="entity_id" type="long" indexed="true" stored="true" required="true" />
    <field name="name" type="string" indexed="true" stored="true" required="true" />
    <field name="entity_type" type="string" indexed="true" stored="true" required="false" />
    <field name="Timestamp" type="date" indexed="true" stored="true" default="NOW" multiValued="false"/>
  </fields>
</schema>

Примечание: - Поле document_id вычисляется в материализованном представлении, которое используется для заполнения индекса, и представляет собой комбинацию других полей, не входящих в этот индекс, но не зависящих от entity_id. Это уникально. - Поле entity_id является ключом пары таблиц, и для одного и того же document_id оно может сильно меняться между обновлением и другим.

Перед полным обновлением, если я запрашиваю индекс как таковой:

http://localhost:8080/qq-solr/system/select/?rows=10&q=document_id:%22French_Polynesia/Huahine~4034376%22

Я получил:

<?xml version="1.0" encoding="UTF-8"?>
  <response>
    <lst name="responseHeader">
      <int name="status">0</int>
      <int name="QTime">5</int>
      <lst name="params">
        <str name="indent">true</str>
        <str name="q">document_id:"French_Polynesia/Huahine~4034376"</str>
        <str name="rows">10</str>
      </lst>
    </lst>
  <result name="response" numFound="1" start="0">
    <doc>
      <date name="Timestamp">2012-03-08T09:47:26.335Z</date>
      <str name="document_id">French_Polynesia/Huahine~4034376</str>
      <long name="entity_id">22902728</long>
      <str name="name">Huahine</str>
      <str name="type">LOCATION</str>
    </doc>
  </result>
</response>

Затем обновляю:

http://localhost:8080/qq-solr/system/dataimport?command=full-import&clean=true&commit=true&optimize=true

(я знаю, что clean, commit и optimise избыточны, но я использовал их просто для уверенности) и через некоторое время получаю сообщение, что все в порядке.

Затем я снова запрашиваю индекс:

http://localhost:8080/qq-solr/system/select/?rows=10&q=document_id:%22French_Polynesia/Huahine~4034376%22

И я получаю:

<?xml version="1.0" encoding="UTF-8"?>
  <response>
    <lst name="responseHeader">
      <int name="status">0</int>
      <int name="QTime">5</int>
      <lst name="params">
        <str name="indent">true</str>
        <str name="q">document_id:"French_Polynesia/Huahine~4034376"</str>
        <str name="rows">10</str>
      </lst>
    </lst>
  <result name="response" numFound="1" start="0">
    <doc>
      <date name="Timestamp">2012-03-09T08:31:07.317Z</date>
      <str name="document_id">French_Polynesia/Huahine~4034376</str>
      <long name="entity_id">22902728</long>
      <str name="name">Huahine</str>
      <str name="type">LOCATION</str>
    </doc>
  </result>
</response>

Но в базе данных entity_id другой!

Я вижу, что метка времени была обновлена, поэтому запись была изменена, но почему сохраняется старое значение?


person GVdP    schedule 09.03.2012    source источник
comment
Не отвечает на ваш вопрос, но почему вы используете оптимизацию с Solr 3.x? Посмотрите здесь, скорее всего, он вам не нужен, и это даже плохо! Я бы использовал optimise=false с dih, чтобы избежать такого плохого поведения по умолчанию.   -  person javanna    schedule 09.03.2012


Ответы (2)


Я бы запустил ваш процесс DataImportHandler (DIH) в интерактивном режиме разработки, чтобы вы могли убедиться, что ваш запрос к базе данных извлекает ожидаемый entity_id. Поскольку временная метка в записи solr обновляется, ваш процесс DIH запущен, но я предполагаю, что причина этого заключается в способе извлечения данных.

person Paige Cook    schedule 09.03.2012
comment
Сделал, как вы сказали, и данные вроде были в порядке, но после этого ядро ​​заработало нормально. Странно то, что такое поведение сохранялось после нескольких обновлений и перезапусков Tomcat, а другое ядро ​​в том же экземпляре Solr не продемонстрировало такого же поведения. Я приму ваш ответ, поскольку именно он продвинул меня вперед. - person GVdP; 13.03.2012

Каждый раз, когда я выполняю подобную операцию с Solr, я всегда сначала вручную очищаю индекс, используя curl, чтобы быть на 100% уверенным, что он стерт. Вот руководство: http://www.alphadevx.com/a/365-Clearing-a-Solr-search-index

person alphadevx    schedule 20.02.2013