我在mySQL中连接了一个我可以搜索的字段。它包含动物以及客户端数据库的所有者名称和地址。我需要能够以任何顺序搜索动物名称,所有者名称和邮政编码。 因此,如果我的名字是约翰·史密斯并且我拥有一只名为Fido的狗并且住在邮政编码AB1 2CD中,我希望如果输入以下任何一项,搜索将成为收益结果:
“john fido AB1” “约翰AB1” “AB1约翰” “AB1 fido” “fido 2CD” “2CD” “汪汪” 等......任何顺序的任何字段,也不是完整的单词,所以“john fido AB1”应该产生与“jo fi AB1”相同的结果
我目前有这个PHP代码,在我的搜索页面上显示单个文本字段,然后爆炸,然后在搜索字词之间添加%:
$list = explode(' ',$_GET["q"]);
$q = implode('%%', $list);
if (!$q) return;
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim,
owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,owner.OwnerID
FROM owner
Inner Join patient ON owner.OwnerID = patient.OwnerID
WHERE CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName) LIKE '%$q%'";
这适用于“AB1 john”和“john fido”但不适用于“fido john”,因为它在连接字段中无序。
任何帮助非常感谢
答案 0 :(得分:1)
我认为您必须拆分关键字,并在关键字字符串中为每个关键字添加查询。
首先(在PHP中),拆分查询字符串并动态生成SQL查询,然后将其发送到数据库。这里有一些伪代码向你展示我的意思:
$keywords = explode(' ', $q);
$sql = "SELECT DISTINCT owner.AddressPrim, owner.PostcodePrim,
owner.OwnerSurnamePrim,owner.OwnerForenamesPrim,
owner.OwnerID
FROM owner
Inner Join patient ON owner.OwnerID = patient.OwnerID";
$first = true;
foreach($keyword in $keywords):
if($first):
$sql += " WHERE ";
$first = false;
else:
$sql += " AND ";
$escaped = mysql_real_escape_string($keyword);
$sql += " CONCAT_WS(' ',owner.AddressPrim, owner.PostcodePrim,
owner.OwnerForenamesPrim,owner.OwnerSurnamePrim,patient.AnimalName)
LIKE '%$escaped%'";
但请注意,对于您在日常操作中可能遇到的表格大小,这不会快到附近。您可能希望研究一种更好的全文搜索方式,无论是使用库还是制作由触发器维护的关键字的交叉引用表。
答案 1 :(得分:1)
MySQL的全文搜索(仅限MyISAM表!)对您有用。
答案 2 :(得分:0)
您可以尝试此http://www.sphinxsearch.com/
你需要专门的服务器来运行这个东西,但如果你有一个,sphinx将很容易解决你的问题,你的查询将不会加载数据库。