使用Sphinx比较字段和/或更新

时间:2016-11-28 00:53:53

标签: mysql sphinx

我在FieldA中有一个值,在FieldB中有另一个值,由下游函数存储以供比较。我需要比较FieldA = FieldB,我使用Mysql:

Select TableA T1
Inner Join TableB T2
On T1.ID=T2.ID
and T1.FIeldA=T2.FIeldB
Set Matched='Y'

然而,为了确保FieldA和FieldB完全相同,因为它们来自不同的源,我需要首先运行复杂的标准化mysql更新,例如。

Update TableA set Field1 Set Field1=Replace(Field1,'Gato','Cat) where Field1 like '%Gato%

(我实际上使用Regex来确保这个词在任何地方都是完整的词,但是想让问题保持简单,以防万一有人觉得有必要指出上述内容可能会失败的地方)。

问题是我有大约2000个条款需要更新,因此我必须在两个字段上运行所有2000个查询,并且每次进行比较时都会。

所以在我看来,理想的解决方案是Sphinx,我可以在其中进行字形或正则表达式。

Gato>Cat
Perro>Dog

为表格编制索引,然后使用Sphinx对其进行比较,以便GatoCat匹配。

但是,我无法找到构建q sphinxQL查询的方法,该查询在两个字段之间执行Match,更不用说会影响更新。有没有这样的解决方案?

1 个答案:

答案 0 :(得分:0)

理论上应该能够使用SphinxSE

http://sphinxsearch.com/docs/current/sphinxse-using.html

https://mariadb.com/kb/en/mariadb/sphinx-storage-engine/

这允许您运行sphinx查询' inside' mysql,就这样。因此可以形成一个mysql查询(使用子查询),该查询基于as sphinx(sub)查询运行UPDATE。

如果在TableB上有一个sphinx索引(启用了字形),理论上称为SphIndexB

UPDATE TableA INNER JOIN SphIndexB 
SET Matched = 'Y' 
WHERE SphIndexB.query = CONCAT('@FIeldB "^',TableA.Field1,'$" ;mode=extended;limit 1')

...它会很慢,因为它必须在表A的每一行上运行完整的sphinx查询 - 唯一的好处是它全部发生在Mysql引擎进程中,而不是在应用程序中编码:)< / p>