MySQL Fulltext с определенным порядком слов - PullRequest
2 голосов
/ 09 июня 2011

Мне интересно, можно ли выполнить поиск MATCH () ПРОТИВ () (полнотекстовый) таким образом, чтобы слова, которые не находятся рядом друг с другом, были расположены в определенном порядке? На моем сайте, когда пользователи вводят слова в двойных кавычках, при поиске отображаются только те слова, которые имеют эти слова в определенном порядке. Например, если это поисковый запрос:

"pizza road"

вернется «Лучшая пицца в будущем», но не «Дорога к лучшей пицце».

Я знаю, что режим BOOLEAN позволяет выполнять поиск по фразе, но это означает, что слова должны быть рядом друг с другом (разделенные пробелом, точкой, запятой и т. Д.), Которые, очевидно, не будут возвращаться ни одним из результаты, перечисленные выше: http://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html

В настоящее время я использую regexp для выполнения этого действия, но само собой разумеется, что это плохой способ поиска в столбце varchar (бессмысленно полнотекстовой индексации), даже если он немного меньше 200 000 строк. Так что я хотел бы знать, возможно ли выполнить тот же поиск, используя только MATCH () AGAINST ()? Или я должен объединить это с регулярным выражением? Или есть еще один метод, о котором я не думал?

Я могу предоставить образцы таблиц / кодов по запросу.

Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 12 июня 2011

Полнотекстовый поиск, как правило, реализуемый в реляционных базах данных, - это хак, предназначенный для обеспечения лишь очень ограниченного подмножества ожидаемых функций в попытке конкурировать с лучшими технологиями. Полнотекстовая индексация от Apple до RDBMS Orange.

Чтобы выполнять поиск с использованием оператора «NEAR», поддерживаемого в традиционных полнотекстовых поисковых системах, вам необходимо реализовать собственный инвертированный индекс с позиционными метаданными, что является традиционным поисковые системы делают это.

И хотя это, безусловно, возможно, большинство разработчиков предпочли бы использовать систему полнотекстового поиска для решения этой проблемы, а не затрачивать значительные усилия, необходимые для изобретения этого колеса.

1 голос
/ 09 июня 2011

Вы пробовали что-то вроде:

SELECT * 
FROM `table` 
WHERE MATCH(`first_column`) 
      AGAINST('+pizza +road' IN BOOLEAN MODE)
      HAVING `first_column` LIKE '%pizza %road%' 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...