Как бы я изменил это, чтобы сделать полнотекстовый поиск вместо как? - PullRequest
0 голосов
/ 13 февраля 2012

после некоторых исследований я собрал этот код для поиска в таблице MySQL в БД. хотя он работает нормально, он ограничивает себя, чтобы соответствовать словам точно так, как пользователь вводит его. Кто-нибудь знает, как сделать так, чтобы это соответствовало моей некой релевантности? Я читал о полнотекстовом поиске, но, похоже, не могу его понять.

например, если вы ищете «оставшиеся без ответа вопросы» в двух полях, я хочу иметь возможность получить такой результат, включив искомые слова в любую строку, в которой они отображаются, и вывести их в соответствии с релевантностью , вот так (пример результатов поиска): - неотвеченные вопросы - отвеченные вопросы - отвечать на вопрос - неотвеченные вопросы - неотвеченные вопросы - вопросы - ответ

    $k = trim ($_GET['search']);
    $i = "";
    $terms = explode (" ", $k);
    $query = "SELECT * FROM table1 WHERE ";

    foreach ($terms as $each){
    $i++;

    if ($i == 1)
    $query .= "fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%'        ";

    else
    $query .= "OR fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%' ";
    }

     // connect
     include_once "connect.php"; //connect 2 db
     $query = mysql_query($query);
     $numrows = mysql_num_rows ($query);
    if ($numrows > 0){

        while ($row = mysql_fetch_assoc ($query)){

    //
    //
    // echo out something here
    //
    //

    }

    }else
         {
        echo "No results found for <b>$k</b>";   
    } 

1 Ответ

0 голосов
/ 13 февраля 2012

, чтобы выполнить полнотекстовый поиск, вам необходимо:

Создать полнотекстовый индекс в таблице (обратите внимание, что поля не могут быть BLOB)

ALTER TABLE tablename ADD FULLTEXT(field1, field2,...);

в вашем случае:

ALTER TABLE table1 ADD FULLTEXT(fld_title, fld_keyword);

при изменении php

    $k = trim ($_GET['search']);
    $i = "";
    $terms = explode (" ", $k);
    $query = "SELECT * FROM table1 WHERE ";

    foreach ($terms as $each){
    $i++;

    if ($i == 1)
    $query .= "fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%'        ";

    else
    $query .= "OR fld_title LIKE '%$each%' OR fld_keyword LIKE '%$each%' ";
    }

для

$k = trim ($_GET['search']);
$query="SELECT * FROM table1 WHERE MATCH(fld_title, fld_keyword) AGAINST ('".$k."')";

, если вы хотите увидеть релевантность результатов:

$query="SELECT *, MATCH(fld_title, fld_keyword) AGAINST ('".$k."') as relevancy FROM table1 WHERE MATCH(fld_title, fld_keyword) AGAINST ('".$k."')";

MATCH-AGAINST возвращает число: 0 для несоответствия или другое в зависимости от соответствия.

Вы можете "упорядочить по релевантности", изменить запрос, чтобы сделать поиск более релевантным ... MATCH (fld_title, fld_keyword) AGAINST('". $ k."')> 0.5

Только одна проблема: часть ПРОТИВ ($ k для вас) должна быть больше 3 символов.

...