【问题标题】:MySQL and Solr consistency, on insert to eitherMySQL 和 Solr 的一致性,在插入时
【发布时间】:2018-03-18 16:04:46
【问题描述】:

我有一个所有用户都可以插入的 MySQL 表。表中的一个字段是该行匹配的 solr 文档总数,称之为total results

在 REST api 代码中,在插入时,我使用 solr 客户端来查找新行匹配的文档总数。我更新该字段,然后返回已完成的资源。很简单,虽然我更喜欢通过 MySQL 自动触发此更新。

更大的问题是,在将新文档插入或从 solr 中删除旧文档时,我现在没有比执行与 REST api 代码具有相同逻辑的 shell 脚本并运行 total results 更新更好的计划了在每一行。

在我看来,我的选择是:

1.) 将data_import 之后的所有行一一更新为 solr。此表大约有 150 万行,因此需要一些时间。

2.) 完全放弃数据库中的字段,并在每次检索资源时从 solr 获取每个 total results 总和。 (在我的情况下这是一个非常糟糕的主意,因为用户在登录时使用 GET /api/resource 作为列表从该表中检索 20k 行)

3.) 找到一种方法来确定新的 solr 文档将影响哪些特定的 MySQL 表行,并将更新限制为这些行。这基本上将涉及逆转搜索过程。

解决方案 1 和 3 基本上要求我编写一个脚本,将 solr data_import 和 MySQL 行的 total results 字段更新作为单个进程进行管理。我可以做到这一点,但我可以利用一些见解来了解如何最好地管理这些问题。

那么,您将如何保持一致性?

【问题讨论】:

  • 看看Alfresco是如何处理问题的,“最终”和“事务”的一致性,也许会对你有所帮助。

标签: mysql database search solr


【解决方案1】:

Luwak 旨在解决此问题(即已存储查询并在被索引的文档匹配时触发它们)。当文档与存储的查询匹配时,您将更新命中计数。删除文档时,执行相同操作,但减少实际计数。

这是一个基于 Lucene 的特定解决方案,因此它不会直接插入到您现有的基础架构中。

另一种选择是手动执行相同的操作;即对于每个存储的搜索 - 如果搜索是简单的布尔匹配这些搜索的术语类型,通过 Solr 的字段类型分析功能将搜索分解为标记,然后对文档执行相同操作索引时。查找与 Solr 生成的任何标记匹配的每个查询(在不同的存储中,在 Solr 或单独的 SQL 表中),然后更新计数。根据文档的大小,这可能很难实现,但并非不可能。

Elasticsearch 将其作为渗透下的一项功能,但是当您谈论 150 万个存储查询时,这也可能会遇到问题。对于 Solr,您会将文档索引到仅内存索引中,然后针对该索引运行所有查询以找到匹配的查询。

【讨论】:

    猜你喜欢
    • 2021-05-06
    • 2018-05-25
    • 2011-07-13
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    相关资源
    最近更新 更多