Полное обновление Solr не очищает индекс - PullRequest
0 голосов
/ 09 марта 2012

У меня проблема с тем, что 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

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

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

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 отличается!

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

Ответы [ 2 ]

0 голосов
/ 20 февраля 2013

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

0 голосов
/ 09 марта 2012

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

...