我在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对其进行比较,以便Gato
和Cat
匹配。
但是,我无法找到构建q sphinxQL查询的方法,该查询在两个字段之间执行Match
,更不用说会影响更新。有没有这样的解决方案?
答案 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>