2013-06-09 9 views
8

Mam ciąg znaków, który zawiera pewne słowa kluczowe, jak to $string = 'one, two, "phrase three words"' próbuję zrobić pełnotekstowego wyszukiwania przy użyciu:MySql wyszukiwanie tekstowe w PHP przy użyciu słów kluczowych ciąg contaning

SELECT *, MATCH (column) AGAINST ('$string') AS score, 
FROM table WHERE MATCH (column) AGAINST ('$string' IN BOOLEAN MODE) ORDER BY score DESC 

Kiedy MySql oddaje wyników, słowo kluczowe "fraza trzy słowa" nie jest dopasowywane jako fraza, ale każde słowo z niego jest dopasowywane jako pojedynczy.

Jak zmodyfikować ciąg lub zapytanie, aby otrzymać wyniki, w których pasuje całe wyrażenie? Próbowałem z stripslashes() dla ciąg, ale wynik jest taki sam.

Odpowiedz

24

Jak MySQL instrukcja mówi:.

zdanie, które jest zamknięte w podwójny cudzysłów („"”) znaków pasuje tylko wiersze zawierające frazę dosłownie, jak to zostało wpisane

Spójrzmy na przykład tabela:

mysql> select * from articles; 
+----+-----------------------+------------------------------------------+ 
| id | title     | body          | 
+----+-----------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 2 | How To Use MySQL Well | After you went through a ...    | 
| 3 | Optimizing MySQL  | In this tutorial we will show ...  | 
| 4 | 1001 MySQL Tricks  | 1. Never run mysqld as root. 2. ...  | 
| 5 | MySQL vs. YourSQL  | In the following database comparison ... | 
| 6 | MySQL Security  | When configured properly, MySQL ...  | 
+----+-----------------------+------------------------------------------+ 

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('"database comparison"' IN BOOLEAN MODE); 

+----+-------------------+------------------------------------------+ 
| id | title    | body          | 
+----+-------------------+------------------------------------------+ 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+-------------------+------------------------------------------+ 

sprawach porządku, gdy słowa są cytowane:

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('"comparison database"' IN BOOLEAN MODE); 

Empty set (0.01 sec) 

Gdy usuwamy cytatów, to będzie szukać wierszy, zawierające słowa "bazy danych" lub "porównania":

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('database comparison' IN BOOLEAN MODE); 

+----+---------------------+------------------------------------------+ 
| id | title    | body          | 
+----+---------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+---------------------+------------------------------------------+ 

kolejność nie ma znaczenia teraz:

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('comparison database' IN BOOLEAN MODE); 

+----+---------------------+------------------------------------------+ 
| id | title    | body          | 
+----+---------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+---------------------+------------------------------------------+ 

Jeśli chcemy uzyskać wiersze zawierające słowo "PostgreSQL" lub wyrażenie "porównanie bazy danych", powinniśmy użyć tego żądania:

mysql> SELECT * FROM articles WHERE MATCH (title,body) 
    AGAINST ('PostgreSQL "database comparison"' IN BOOLEAN MODE); 

+----+---------------------+------------------------------------------+ 
| id | title    | body          | 
+----+---------------------+------------------------------------------+ 
| 1 | PostgreSQL Tutorial | DBMS stands for DataBase ...    | 
| 5 | MySQL vs. YourSQL | In the following database comparison ... | 
+----+---------------------+------------------------------------------+ 

fiddle

Upewnij się, że słowa, szukasz, nie są w list of stopwords, które są ignorowane.

+0

Witam user4035, rozumiem podstawy wyszukiwania pełnotekstowego i jak to działa, moim celem jest uzyskanie wyników, jak w twoim ostatnim przykładzie, ale problem jest, gdy umieszczam ciąg, który zawiera podwójne cudzysłowy przeciwko. Wyniki nie zawierają pełnej frazy, ale słowa w wyrażeniu. – Vasko

+0

@ Vasko To bardzo dziwne, ponieważ dla mnie, kiedy umieszczam słowa w cudzysłowach, MySQL wyszukuje dokładnie frazę, a nie słowa. Skopiuj mój przykładowy stół z skrzypiec i wypróbuj ostatnie zapytanie w twoim systemie. Daj mi znać, jak to działa. – user4035

+1

Użyłem http://sphinxsearch.com/ zamiast wbudowanego wyszukiwania FULLTEXT mySql, a teraz aplikacja jest znacznie bardziej responsywna. I tak dziękuję za szczegółową odpowiedź. – Vasko

Powiązane problemy