我會用MySQL's Full-Text Search Functions爲您提供不同的選擇。讓我們開始準備表:現在
ALTER TABLE persons ADD FULLTEXT (`firstname`, `lastname`);
,firstname
和lastname
要通過全文以搜索匹配使用的列:
SELECT * FROM persons
WHERE MATCH (firstname,lastname)
AGAINST ('John D' IN NATURAL LANGUAGE MODE);
結果將是:
+------------+----------------+------------------+---------+
| firstName | lastName | email | etc... |
+------------+----------------+------------------+---------+
| John | Doe | [email protected] | etc... |
+------------+----------------+------------------+---------+
| John | Michaels | [email protected] | etc... |
+------------+----------------+------------------+---------+
爲什麼這兩個?因爲找到了John
(作爲一個詞),但John Doe
位於第一行,因爲與搜索的術語有很多相似之處。
說,這可以應用這個工具與主義。我會假設你的模型是這樣的:
class Person{
/** @column(type="string", name="firstname")*/
protected $firstName;
/** @column(type="string", name="lastname")*/
protected $lastName;
/** @column(type="string")*/
protected $email;
}
讓我們創建的搜索功能:
public function search($term){
$rsm = new ResultSetMapping();
// Specify the object type to be returned in results
$rsm->addEntityResult('Models\Person', 'p');
// references each attribute with table's columns
$rsm->addFieldResult('p', 'firstName', 'firstName');
$rsm->addFieldResult('p', 'lastName', 'lastname');
$rsm->addFieldResult('p', 'email', 'email');
// create a native query
$sql = 'select p.firstName, p.lastname, p.email from persons p
where match(p.firstname, p.lastname) against(?)';
// execute the query
$query = $em->createNativeQuery($sql, $rsm);
$query->setParameter(1, $term);
// getting the results
return $query->getResult();
}
Finnally,以及例如:
$term = 'John D';
$results = search($term);
// two results
echo count($results);
其他注意事項:
- 在mysql 5.7之前,只能添加全文
MyISAM
表。
- 只能索引
CHAR
,VARCHAR
或TEXT
列。
- 當在搜索中使用
IN NATURAL LANGUAGE MODE
時,當結果表示記錄的< 50%
時,mysql返回空結果。
嗨,謝謝,但這隻會工作,如果第一個名字是一個簡單的單詞。例如,如果它的名字「馬林路德」和姓氏是「國王」,它將無法正常工作。謝謝你的幫助! –
我想你最好提供兩個名稱搜索框。 –