MySQL 和 Solr 的一致性,在插入时

标签 mysql database search solr

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

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

更大的问题是,在向 solr 插入新文档或从 ​​solr 删除旧文档时,我现在没有更好的计划,除了执行与 REST api 代码具有相同逻辑的 shell 脚本,然后运行 ​​total结果每行都会更新。

据我所知,我的选择是:

1.) 将 data_import 后的所有行逐一更新到 solr。该表大约有 150 万行,因此需要一段时间。

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

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

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

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

最佳答案

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

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

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

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

关于MySQL 和 Solr 的一致性,在插入时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46612682/

相关文章:

php - 重新发布 : Query messages theard list

MYSQL 列出所有类别的所有产品

sql - Greenplum 与 PostgreSQL

database - 提交钩子(Hook)后光滑

database - 用户信息和登录凭据的表设计?

c++ - 使用 C++ 在文件中进行字符串搜索/索引

mysql - 我的查询返回很多列

php - mysql_connect() : Access denied for user 'user' @'localhost'

android - 实现 Android 搜索过滤器,如 FourSquare 或 Ebay

iOS实时搜索支持