MySQL Match Fulltext - PullRequest
       20

MySQL Match Fulltext

5 голосов
/ 10 декабря 2010

Я пытаюсь выполнить полнотекстовый поиск с помощью mysql, чтобы найти строку.Проблема в том, что он возвращает странные результаты в первую очередь.

Например, строка 'passat 2.0 tdi':

            AND MATCH (
            records_veiculos.titulo, records_veiculos.descricao
            )
            AGAINST (
             'passat 2.0 tdi' WITH QUERY EXPANSION
            )

возвращает это как первый результат (остальныехорошо):

Volkswagen Passat Variant 1.9 TDI- ANO 2003

что неверно, так как в этом примере нет "2.0".

Что бы это могло быть?

edit : Кроме того, поскольку это, вероятно, будет большая база данных (ожидающая до 500 000 записей), этот метод поиска будет наилучшим для себя, или лучше установить какую-либодругой поисковик, как Сфинкс?Или, если это не так, как показать релевантные результаты?

edit2 : Для записи, несмотря на то, что вопрос помечен как отвеченный, проблема с разделителями MySQL сохраняется, поэтому еслиу любого есть предложение о том, как избежать разделителей, оно будет оценено и стоит 500 ставок на карту.Решение, которое я нашел для увеличения набора результатов, состояло в том, чтобы заменить WITH QUERY EXPANSION на IN BOOLEAN MODE, используя операторы, чтобы заставить двигатель получить нужные мне слова, например:

AND MATCH (
records_veiculos.titulo, records_veiculos.descricao
)
AGAINST (
 '+passat +2.0 +tdi' IN BOOLEAN MODE
)

Это не решило вообще, но, по крайней мере, значимость результатов значительно изменилась.

Ответы [ 4 ]

7 голосов
/ 10 декабря 2010

Из документации MySQL по полнотекстовому поиску :

"Синтаксический анализатор FULLTEXT определяет, где начинаются и заканчиваются слова, путем поиска определенных символов-разделителей, например,« »(пробел),«, »(запятая) и«. »(Точка)."

Это означает, что точка разделяет 2 и 0. Поэтому он не ищет «2,0»; он ищет «2» и «0», а не находит его. С QUERY EXPANSION, вероятно, вызывает появление соответствующих связанных слов, что устраняет необходимость в том, чтобы '2' и '0' были отдельными словами в ранжировании результатов. Может также применяться минимум символа.

5 голосов
/ 10 декабря 2010

По умолчанию я считаю, что mysql только индексирует и сопоставляет слова с 4 или более символами.Вы могли бы также попытаться избежать периода?Это можно игнорировать или использовать как символ остановки.

4 голосов
/ 10 декабря 2010

Какой ранг совпадения он возвращает за это?Должно ли совпадение содержать все «слова», насколько я понимаю, оно работало как Google и должно соответствовать только некоторым словам.

Сказав это, подумайте над добавлением WITH QUERY EXPANSION, чтоавтоматически запускается второй поиск «связанных» слов, которые могут не соответствовать тому, что вы ввели, но которые полнотекстовые движки считают вероятными связанными.

Соответствующая документация: http://dev.mysql.com/doc/refman/5.1/en/fulltext-query-expansion.html

1 голос
/ 17 декабря 2010

"."это то, что соответствует 2003 в ваших результатах запроса.

Если вы собираетесь выполнять поиск по 3-символьным текстовым строкам, вы должны установить ft_min_word_len = 3 в вашей конфигурации mysql, перезапустите mysql.В противном случае поиск по «tdi» вернет результаты с «TDI-», но не только с «TDI», потому что строки с «TDI-» будут проиндексированы, а только «TDI» не будет.

После выполненияэто изменение конфигурации, вам придется перестроить свой индекс для этой таблицы.(Внимание: ваш индекс может быть значительно больше.)

...