簡體   English   中英

PHP MySQL Match()對()全文搜索不起作用

[英]PHP MySQL Match() Against() Fulltext search not working

在過去的幾周中,我一直在嘗試進行全文搜索,但是似乎沒有任何效果。 我正在使用GoDaddy托管和myisam表。 我按照SQL開發人員網站上的說明,使用名為“搜索”的全文創建我的數據庫,其中包含“名,姓,用戶名”列。 盡管表中有11行,但全文搜索在輸入完整的用戶名/名字/姓氏時才搜索。

SQL:

    SELECT * FROM users
    WHERE MATCH (username, firstname, lastname) AGAINST ('$key');

我曾經嘗試過在自然語言模式,布爾模式和以前一樣的常規模式下進行嘗試。 創建的索引是FULLTEXT索引,引擎是MYISAM。 我認為這沒有任何作用。

我需要它的原因是因為我希望用戶能夠搜索用戶名/名稱的一部分並按相關性對其進行排序,例如“ Tom”和“ Tomas”都將被返回...

搜索完整的用戶名(例如“ bisoncode”)將返回該行,但搜索“ bisonco”則不會。

AJAX腳本

function getStates(value) {
    $.post("search.php", {name:value},function(data){
        $("#results").html(data);
    }
    ); 
}

搜尋HTML

<input type="text" class="search" placeholder="Search..." autocomplete="off" onkeyup="getStates(this.value)">
<div id="results"></div>

執行查詢(上面發布)結果

if($result->num_rows == 0){
    echo "no results!";
} else {
while($row = $result->fetch_assoc()){
       $array[] = $row['id'];
       $array[] = $row['username'];
       $array[] = $row['firstname'];
       echo json_encode($array)."<br>";
}

如果您的MySQL版本低於5.6,則可以理解使用MyISAM,否則建議使用InnoDB,因此下面的示例將按所示工作。

該站點中的示例幾乎看起來像您要嘗試執行的操作: http : //www.inanzzz.com/index.php/post/hfo7/how-to-do-full-text-search-in-myssql

# Create table.
CREATE TABLE `person` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `middlename` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `surname` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  `code` varchar(45) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT(`name`,`middlename`,`surname`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

# Populate table.
INSERT INTO `person` (`name`, `middlename`, `surname`, `code`) VALUES
('John', 'Joseph', 'Travolta', 'JJT'),
('John', '', 'Lenon', 'JL'),
('John', '', 'Wayne', 'JW'),
('John', 'Paul', 'John', 'JPJ'),
('Robert', '', 'DeNiro', 'RD'),
('Elton', '', 'John', 'EJ'),
('Abi', 'John John', '', 'AJ'),
('Johny', '', '', 'J'),
('John', 'John', 'John', 'JJJ');

基本查詢

# Basic select query.
SELECT *
FROM person
WHERE
MATCH(`name`, `middlename`, `surname`) AGAINST ('John' IN NATURAL LANGUAGE MODE);

+----+-------+------------+----------+------+
| id | name  | middlename | surname  | code |
+----+-------+------------+----------+------+
|  9 | John  | John       | John     | JJJ  |
|  4 | John  | Paul       | John     | JPJ  |
|  7 | Abi   | John John  |          | AJ   |
|  1 | John  | Joseph     | Travolta | JJT  |
|  2 | John  |            | Lenon    | JL   |
|  3 | John  |            | Wayne    | JW   |
|  6 | Elton |            | John     | EJ   |
+----+-------+------------+----------+------+
7 rows in set (0.00 sec)

具有相關性的查詢

SELECT *,
MATCH(`name`, `middlename`, `surname`) AGAINST ('John' IN NATURAL LANGUAGE MODE) AS score
FROM person
ORDER BY score DESC;

+----+--------+------------+----------+------+----------------------+
| id | name   | middlename | surname  | code | score                |
+----+--------+------------+----------+------+----------------------+
|  9 | John   | John       | John     | JJJ  |    0.035737544298172 |
|  4 | John   | Paul       | John     | JPJ  | 0.023825030773878098 |
|  7 | Abi    | John John  |          | AJ   | 0.023825030773878098 |
|  1 | John   | Joseph     | Travolta | JJT  | 0.011912515386939049 |
|  2 | John   |            | Lenon    | JL   | 0.011912515386939049 |
|  3 | John   |            | Wayne    | JW   | 0.011912515386939049 |
|  6 | Elton  |            | John     | EJ   | 0.011912515386939049 |
|  5 | Robert |            | DeNiro   | RD   |                    0 |
|  8 | Johny  |            |          | J    |                    0 |
+----+--------+------------+----------+------+----------------------+
9 rows in set (0.00 sec)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM