【问题标题】:Apache Solr still keep old data after delta import增量导入后 Apache Solr 仍保留旧数据
【发布时间】:2019-01-16 08:44:21
【问题描述】:

我正在使用 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>

delta导入成功,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是MySql中类型为int的主键。

我将customer_idname添加到Solr的schema,并将customer_id设置为pint

下一张截图是 Solr 的schema 标签,上面写着unique key fieldid

---------------- 更新 -------------------

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>

【问题讨论】:

  • solr 文档的唯一 ID 是什么?
  • @AbhijitBashetti 我更新了,请看底部的update部分
  • 名为“id”的字段是否与“customer_id”相同。您是否为它创建了任何别名。能否请您分享 schema.xml 中的字段定义?
  • @AbhijitBashetti id 是默认字段,我没有为它创建任何别名。请在bootom查看managed-schema.xml
  • 请按照 MatsLindh 提供的答案

标签: solr lucene dataimporthandler


【解决方案1】:

由于您没有 id 字段的值,Solr 正在为您生成一个唯一的值。您必须包含一个实际上是您提交的文档的唯一 id 的 id,或者更改 uniqueKey 定义 - 我建议先做,因为以后可以在必要时轻松更改它。

如果 customer_id 唯一标识该文档,请将 customer_id AS id, .. 添加到您的 SQL SELECT 语句中:

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

【讨论】:

  • 我将customer_id as id 添加到querydeltaImportQuery,它有效,谢谢!但是我发现回复只有idname_version_customer_id消失了。我可以将customer_id 当作uniqueKey 并删除归档的id 吗?我尝试在managed-schema.xml 中手动将customer_id 作为uniqueKey,但这导致我的核心无法启动。
  • 在我的示例中,customer_id 被提及了两次 - 如果您只将其更改为 AS id,那么在名称 id 下将只返回一列。也添加, customer_id,这样您就可以得到两次值——一次在customer_id 字段下,一次在id 字段下。您还可以在架构中添加 copyField 指令,以便在 Solr 端执行此操作。
  • 知道了!那么我可以直接使用customer_id 作为uniqueKey 并删除字段id 吗?
  • 这是一个选项,但这可能还需要删除在索引时添加 GUID 的更新处理器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-26
  • 1970-01-01
相关资源
最近更新 更多