Apache Solr по-прежнему сохраняет старые данные после дельта-импорта - PullRequest
0 голосов
/ 16 января 2019

Я использую Solr 7,6.

Я делаю полный импорт из mysql, таблица customer выглядит так:

customer_id pk   int
customer_code    varchar
name             varchar
update_datetime  timestamp

Я изменяю одну запись, меняю

customer_id    customer_code    name

46027          C1               zxc

до

customer_id    customer_code    name

46027          C1               789

тогда я делаю импорт дельты с data-config выглядит как

<dataConfig>

  <dataSource type="JdbcDataSource" driver="com.mysql.cj.jdbc.Driver"
    url="jdbc:mysql://localhost:3306/test" user="test" password="123456"/>
  <document>

    <entity name="customer" pk="customer_id"
            query="select customer_id, customer_code, name from customer"
            deltaImportQuery="select customer_id, customer_code, name from customer where customer_id='${dih.delta.customer_id}'"
            deltaQuery="select customer_id from customer where update_datetime &gt; '${dih.last_index_time}'"
            >        
    </entity>
  </document>
</dataConfig>

дельта-импорт выполнен успешно, solr может вернуть новый результат с помощью запроса name:789.

Однако, когда я запрашиваю старые данные name:zxc, он все равно может вернуть старые данные:

{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"name",
      "_":"1547619027918"}},
  "response":{"numFound":1,"start":0,"docs":[
      {
        "customer_id":46027,
        "name":"zxc",
        "id":"dd513a36-dfff-4ed2-a4fe-f728f42adfce",
        "_version_":1622797739301535744}]
  }}

Почему? и как я могу сделать так, чтобы solr удалял старые данные, если эта запись была обновлена?

customer_id - это первичный ключ с типом int в MySql.

Я добавил customer_id и name к schema Solr и установил customer_id как pint.

Следующий снимок экрана - тег Solr schema, в котором говорится, что unique key field равен id.

enter image description here

---------------- ОБНОВЛЕНИЕ -------------------

managed-schema.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Solr managed schema - automatically generated - DO NOT EDIT -->
<schema name="default-config" version="1.6">
  <uniqueKey>id</uniqueKey>
  <fieldType name="ancestor_path" class="solr.TextField">
    <analyzer type="index">
      <tokenizer class="solr.KeywordTokenizerFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>
    </analyzer>
  </fieldType>
  <fieldType name="binary" class="solr.BinaryField"/>
  <fieldType name="boolean" class="solr.BoolField" sortMissingLast="true"/>
  <fieldType name="booleans" class="solr.BoolField" sortMissingLast="true" multiValued="true"/>

  <!-- field : delimited_payloads_float, delimited_payloads_int, 
  delimited_payloads_string, descendent_path, location, location_rpt,
   lowercase-->

  <!-- field starts with p, e.g. pdate -->

  <fieldType name="random" class="solr.RandomSortField" indexed="true"/>
  <fieldType name="string" class="solr.StrField" sortMissingLast="true" docValues="true"/>
  <fieldType name="strings" class="solr.StrField" sortMissingLast="true" docValues="true" multiValued="true"/>

  <!-- field name starts with text_-->

  <field name="customer_id" type="pint" uninvertible="true" indexed="true" stored="true"/>
  <field name="name" type="text_en" uninvertible="true" indexed="true" stored="true"/>
  <field name="_root_" type="string" docValues="false" indexed="true" stored="false"/>
  <field name="_text_" type="text_general" multiValued="true" 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"/>

  <!-- default dynamic fields -->
</schema>

1 Ответ

0 голосов
/ 17 января 2019

Поскольку у вас нет значения для поля id, Solr создает для вас уникальное значение. Вам придется либо добавить идентификатор, который на самом деле является уникальным идентификатором для документа, который вы отправляете, либо изменить определение uniqueKey - я предлагаю сделать первое, так как его можно легко изменить позже, если это необходимо.

Если customer_id однозначно идентифицирует документ, добавьте customer_id AS id, .. в операторы SQL SELECT:

SELECT customer_id AS id, customer_id, customer_code, name FROM customer
...