Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

для всех букв

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

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

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


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

Было много вопросов по поводу SO;например :


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

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

Итак, как говорится, у вас ЕСТЬ несколько вариантов получить то, что вы хотите:

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

  • Настоящая полнотекстовая индексация в MySQL.MySQL имеет способ создания ПОЛНОТЕКСТНЫЕ индексы.Вам необходимо использовать механизм данных MyISAM, и существуют ограничения на то, что именно вы можете или не можете делать.Но это гораздо мощнее, чем базовая функциональность «подобия», которую имеет SQL.Я бы порекомендовал прочитать об этом, если вам интересно.

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top