2009-09-09 6 views
4

Я пытаюсь найти строку в моей БД, но она должна быть в состоянии сопоставить любое слово, а не всю фразу.mySQL LIKE query

Предположим, данные таблицы имеют текст, подобный a b c d e f g. Тогда, если я ищу d c b, он должен быть в состоянии показать результаты.

field LIKE '%d c b%' не работает таким образом.

Может кто-то предложить более надежный способ поиска, возможно, покажет счетчик релевантности.

Я не против использования PHP также для вышеуказанного, но предпочитаю выполнять поиск на уровне БД.

ответ

4

Для получения лучших результатов для ваших данных необходимо создать индекс FULLTEXT.

CREATE TABLE mytable (id INT NOT NULL, data TEXT NOT NULL, FULLTEXT KEY fx_mytable_data) ENGINE=MyISAM 

SELECT * 
FROM mytable 
WHERE MATCH(data) AGAINST ('+word1 +word2 +word3' IN BOOLEAN MODE) 

Обратите внимание, что индекс одна буквы слова (как в вашем примере), вам необходимо установить ft_min_word_len в 1 в MySQL confguration.

Этот синтаксис может работать, даже если у вас нет индекса (если ваша таблица MyISAM), но будет довольно медленной.

1

Если таблица находится в MyISAM, вы можете использовать полнотекстовый поиск, встроенный в MySQL: 11.8. Full-Text Search Functions

Хотя будут некоторые ограничения (например, если я правильно помню, вы можете не поиск на слово короче X символов - X, как правило, 3 или 4).


Другим решением было бы использовать некоторые Fulltext двигатель, как Lucene, Solr или Sphinx - те, которые обычно делают лучшую работу, когда дело доходит до полнотекстового-поиска: это их работа(работа в MySQL является для хранения данных, а не для полнотекстового поиска)

Было много вопросов о тех, кто на SO; например:


Если вы используете PHP и не может больше ничего установить, есть реализация полного PHP из Lucene: Zend_Search_Lucene

2

Я думаю, что вы хочу сделать это для любого из букв:

field LIKE '%d%' or field like '%c%' or field like '%b%' 

для всех букв

field LIKE '%d%' and field like '%c%' and field like '%b%' 
+0

Но это вернет все, что имело любой из них, в отличие от возвращения только тех, у кого есть все или некоторые из них. – nilamo

+0

Да, но это не похоже на то, что он хочет «совместить любое слово, а не всю фразу». –

+0

-1 Это также возвращает строку, такую ​​как «** d ** hhlkjfyfjfjf ** c ** kjhtyfgv ** b **», и в этом случае вы можете также сказать «LIKE»% d% c% b% ». –

1

В конце концов, предложения MySQL LIKE не предназначены для использования в качестве «мощных» инструментов поиска для сопоставления на основе слов. Это простой инструмент для поиска частичных фраз. Он также не известен для масштабирования, поэтому, если вы делаете это на высокопроизводительном веб-сайте пропускной способности, вам, вероятно, понадобится другое решение.

Так что, как говорится, есть несколько вариантов для вас, чтобы получить то, что вы хотели: поддержка

  • REGEX, есть поддержка в MySQL для выполнения REGEX based searches. Используя это, и с достаточно сложным REGEX вы можете найти то, что ищете.

  • Истинный индексирование полного текста в MySQL. У MySQL есть способ создать FULLTEXT indexes. Вам нужно использовать механизм данных MyISAM, и есть ограничения на то, что именно вы можете или не можете сделать. Но это гораздо более мощная, чем базовая «аналогичная» функциональность, которую имеет SQL. Если вы заинтересованы, я рекомендую прочитать его.

  • Сторонние индексы. Это на самом деле маршрут, который большинство людей идет. Они будут использовать Lucene/Solr или другие аналогичные технологии индексирования, которые специально предназначены для полнотекстового поиска слов с различной логикой, точно так же, как работают современные веб-поисковые системы. Они чрезвычайно эффективны, потому что они, по сути, сохраняют свою собственную базу данных, где они разбивают все и хранят ее таким образом, который лучше всего подходит для таких типов поиска.

Надеюсь, один из этих трех вариантов будет работать для вас.

0

При использовании like пункт заботиться, что это %variable% или variable% не %variable.

Во-вторых. чтобы сделать аффективный поиск, используйте функцию explode, чтобы сломать слова, например, если я ищу «узнать php», он должен искать вот так: «learn + php», как в Google. Это функция explode().

+0

Это скорее комментарий, чем ответ. –