2015-07-13 3 views
1

У меня есть таблица, содержащая столбец с названием.лучший метод поиска ключевых слов

Ввод берется у пользователя в виде строки. Строка на самом деле представляет собой группу ключевых слов, разделенных пробелом.

Я хочу найти всю таблицу, ищущую записи с полями заголовка, содержащими некоторые ключевые слова, представленные в строке ввода пользователем, и результаты должны отображаться в порядке их совпадения.

Для Ex:

RecordA -> title -> "apple mango grapes banana" 
RecordB -> title -> "apple lemon orange" 
RecordC -> title -> "banana" 
RecordD -> title -> "lemon mango grapes" 

Пусть строку ввода от пользователя: «яблоко манго оранжевый» Тогда я хочу результат со страницы PHP, чтобы

Record A // 2 matches 
Record B // 2 matches 
Record D // 1 match 
Record C // 0 match 

Предложите мне эффективный способ сделать это в php ..

Примечание: База данных находится в Mysql. Его нельзя изменить, чтобы добавить индекс полнотекстового поиска в таблицу.

+0

Это может быть медленным использование БД, так как вам придется запросить всю таблицу и проанализировать ее самостоятельно на PHP. Если вы собираетесь использовать большой объем данных, вы должны использовать SolR, который предназначен для такого рода вещей ... – Random

+0

Plz уточнить .. – user2653926

+0

Это зависит от вашего набора данных, каков размер ваших данных? 10, 100, 1 000, 10 000, 1 000 000 рядов ...? и на словах, сколько слов по строкам? 1-5, 1-20 ...? – Random

ответ

1

Лучший способ - поиск в полнотекстовом формате (см. here). Это является правильным способом делать то, что вы хотите, и это наиболее эффективно на сегодняшний день.

Что вы можете сделать в отсутствие полнотекстового поиска что-то вроде этого:

select t.* 
from table t 
where title like '%word1%' or 
     title like '%word2%' or 
     . . . 
order by ((title like '%word1%') + 
      (title like '%word2%') + 
      . . . 
     ) desc; 

Вам придется разобрать слова пользователя обеспечивает, чтобы каждое слово. Также обратите внимание, что у вас есть проблема с границами слов. Как указано выше, это найдет любое вхождение строки букв, даже если внутри слова. Если это проблема, используйте регулярные выражения вместо like. Но реальное решение - полнотекстовый поиск.

+0

Что относительно перфомансов на 1 000 000 рядов? – Random

+0

Что это за знак +? – user2653926

+1

@ user2653926 он вычисляет ваш счет, чтобы увидеть, сколько совпадающих слов находится в фактической строке – Random

Смежные вопросы