MySQL как запрос - PullRequest
       19

MySQL как запрос

4 голосов
/ 09 сентября 2009

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

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

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

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

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

Ответы [ 5 ]

4 голосов
/ 09 сентября 2009

Для достижения наилучших результатов вам необходимо создать 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 конфигурации.

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

2 голосов
/ 09 сентября 2009

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

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

для всех букв

field LIKE '%d%' and field like '%c%' and field like '%b%'
1 голос
/ 09 сентября 2009

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

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

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

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

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

Надеюсь, вам подойдет один из этих трех вариантов.

1 голос
/ 09 сентября 2009

Если ваша таблица находится в MyISAM, вы можете использовать поиск FULLTEXT, интегрированный в MySQL: 11.8. Функции полнотекстового поиска

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


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

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


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

0 голосов
/ 11 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...