我正在使用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。这是一个很好的方法吗,还是有更好的方法?
感谢。
答案 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