2

我已经在 mySQL 中连接以生成一个可以搜索的字段。这包含客户数据库的动物以及所有者名称和地址。我需要能够按任何顺序按动物名称、所有者姓名和邮政编码进行搜索。因此,如果我的名字是 john smith,并且我拥有一只名叫 Fido 的狗并且住在邮政编码 AB1 2CD 中,那么如果输入以下任何一项,我希望搜索能够产生结果:

“john fido AB1” “john AB1” “AB1 john” “AB1 fido” “fido 2CD” “2CD” “fido” 等...即任何顺序的任何字段,也不完整的单词,所以“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”,因为它在连接字段中出现故障。

非常感谢任何帮助

4

3 回答 3

1

MySQL 的全文搜索(仅限 MyISAM 表!)可能对您有用。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

于 2010-02-24T06:51:37.590 回答
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%'";

但请注意,对于您在日常操作中可能会遇到的表格大小,这不会很快。您可能想研究一种更好的全文搜索方法,无论是使用库还是制作由触发器维护的关键字的交叉引用表。

于 2010-02-24T01:29:58.177 回答
0

你可以试试这个http://www.sphinxsearch.com/

你需要专门的服务器来运行这个东西,但是如果你有一个,sphinx 会很容易地解决你的问题并且你的查询不会加载数据库。

于 2010-03-04T14:34:21.610 回答