插入到

时间:2017-10-06 19:27:26

标签: mysql database search solr

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

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

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

我认为,我的选择是:

1。)将total results之后的所有行逐个更新为solr。这个表大约有1.5M行,所以需要一段时间。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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