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

Php 如何创建包含缩写的MySQL搜索查询,php,mysql,search,subquery,Php,Mysql,Search,Subquery,我正在使用PHP和MySQL。现在,我正在用一系列喜欢和联合搜索我的数据库,因此,基于用户类型的查询可能看起来像什么 WEHRE类标题“%Term1%”和类标题“%Term2%”并集。。。作者喜欢的地方… 你明白了。我在每个术语周围添加通配符,术语由空格决定。然后,当返回结果时,我突出显示他们搜索的术语。很简单,不想在这里与谷歌竞争。:) 现在,我添加了一个保存圣经引用的字段,用户可以在其中使用缩写,例如“Mt”或“Mt.”或“Matt”或“Matt.”或Matthew。现在,通过从任何查询中剥

我正在使用PHP和MySQL。现在,我正在用一系列喜欢和联合搜索我的数据库,因此,基于用户类型的查询可能看起来像什么
WEHRE类标题“%Term1%”和类标题“%Term2%”并集。。。作者喜欢的地方…

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

现在,我添加了一个保存圣经引用的字段,用户可以在其中使用缩写,例如“Mt”或“Mt.”或“Matt”或“Matt.”或Matthew。现在,通过从任何查询中剥离句点,我可以很容易地将其从5减少到3,但是包含其他句点的最佳方法是什么

此外,无论他们搜索Mt、Matt或Matthew,我仍然想突出显示完整的单词Matthew,所以我要再次说明如何将其链接在一起

我提出的唯一解决方案是制作一个3D阵列,循环说,如果我有一个Matt或Mt,将其更改为Matthew,每本书乘以66。这是一个好方法,还是有更好的方法


谢谢。

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

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

我认为你应该建立一个可能的别名表,虽然公平地说,圣经现在可能已经被广泛地索引了。那么查询会是什么样子呢?我以前从来没有用过这样的东西。我喜欢有索引表的建议,但我正试图找出如何形成布局,考虑到标题可以是2到30个单词。那么,我会有一个40列宽的表,它可以容纳我想要搜索的所有数据,并且每一行都有一个索引吗?那么,我该如何确保一个不完整的词仍然被提取出来呢?我不是又回到喜欢的状态了吗?很抱歉,我太天真了,虽然我对这一点并不陌生,但我是自学成才的,所以像这样更复杂的事情并不那么容易知道。谢谢你的耐心。嗯,我想到的索引表只有两列:一列保存搜索词,另一列是引用文章的外键。要创建索引表,请循环浏览所有标题,将它们拆分为单个单词,然后将这些单词添加到索引表中。在这一步中,还要添加任何别名,因此当您在标题中遇到“Mt”一词时,还要添加“Matt”和“Matthew”,引用同一篇文章。如果你想从一个完全不同的方向来看,考虑一下MySQL的全文搜索功能:好的,我知道它是如何工作的,但是那时我不会有300行是简单的“行”吗?或者,考虑到我已经有300行了,这不是一件坏事吗?也许最好将列反转,将单词作为索引,并使用逗号分隔的第二个字段来保存ID?还有一部分,如果有人因为懒得输入“神学”而搜索“提奥”,我仍然希望它返回一个结果,但随后我又回到了喜欢的查询。仍然希望你能够回答我的最后一个问题。