如何创建MySQL搜索查询以包含缩写

时间:2014-01-13 12:18:15

标签: php mysql search subquery

我正在使用PHP和MySQL。现在我正在使用一系列LIKE和UNION搜索我的数据库,因此查询基于用户类型可能看起来像什么 WEHRE title LIKE '%Term1%' AND title LIKE '%Term2%' UNION ... WHERE author LIKE ...

你明白了。我在每个术语周围添加通配符,术语由空格决定。然后,当返回结果时,我会突出显示他们搜索的术语。很简单,不要试图在这里与谷歌竞争。 :)

现在我添加了一个字段,其中包含用户可能使用缩写的圣经参考,例如“Mt”或“Mt.”或“马特”或“马特”。或马修现在我可以通过从任何查询中删除句点来轻松地将其从5减少到3,但是包含其他查询的最佳方法是什么?

此外,无论他们搜索Mt或Matt还是Matthew,我仍然想要突出完整的单词Matthew,所以我再次讨论如何将它链接在一起。

我想出的唯一解决方案就是制作一个3D阵列并循环说,如果我有一个Matt或Mt,将其更改为Matthew,每本书的时间为66。这是一个很好的方法吗,还是有更好的方法?

感谢。

1 个答案:

答案 0 :(得分:1)

一种非常简单的方法是构造一个表来保存别名组:

CREATE TABLE AliasGroup ( Alias NVARCHAR(50), GroupId INT )
INSERT INTO AliasGroup
VALUES ( 'Mt', 1 )
      ,( 'Matt', 1 )
      ,( 'Matthew', 1 )
      ,( 'Lk', 2 )
      ,( 'Luke', 2 )
      /* --- etc --- */

然后,对于AliasGroup表中存在的每个搜索词,还要突出显示具有相同GroupId的所有其他别名。

现在,要搜索'Mt','Matt'和'Matthew',当只有其中一个是实际的搜索词时,快速而肮脏的查询看起来像这样:

SELECT ...
FROM ...
CROSS JOIN
   (SELECT Alias FROM AliasGroup 
    WHERE GroupId = (SELECT GroupId FROM AliasGroup WHERE Alias = $term1)) A
WHERE title LIKE '%' + Alias + '%'

然而,这不是一种理想的方法,并且由于WHERE子句中的LIKE运算符,它可能无法很好地执行。如果您事先构建了一个唯一术语的索引表,那会好得多。这很容易创建,例如使用PHP - 只需循环遍历表的所有记录,并按单个单词拆分所有标题等。删除标点符号,并将单个单词与原始记录的ID一起存储在索引表中。每当遇到具有一个或多个别名的术语时,也要在索引表中写入每个别名。然后对索引表进行所有搜索:

SELECT Id
FROM IndexTable 
WHERE Term = $term1