2017-10-06 40 views
0

我有一个MySQL表,所有用户可以插入到。表格中的一个字段是该行匹配的solr文档的总数,称之为total resultsMySQL和Solr的一致性,插入到任一

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

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

我的选择,在我看来,是这些:

1)更新data_import毕竟行SOLR,一个接一个。这个表格大约有150万行,所以需要一段时间。

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

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

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

那么,你会如何保持一致性?

+0

查看Alfresco如何处理问题,“最终”和“事务性”的一致性,也许它会帮助你。 – Lista

回答

0

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

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

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

Elasticsearch将此作为渗透下的一项功能,但当您谈论1.5M存储查询时,这可能也会遇到问题。对于Solr,您可以将文档编入索引内存索引,然后运行所有查询来查找匹配的查询。