Xpoint
   [напомнить пароль]

поиск и сортировка по релевантности

Метки: [без меток]
[арх]
2005-11-21 18:59:45 [обр] NeiTrinO[досье]

Понимаю, что тема стара как мир, но у меня не получается. Посему прошу совета.
Задача: необходимо просто искать по введенному пользователем слову (или части слова) совпадения в БД (пусть будет одно поле) ну и выводить выбранные данные по релевантности.

Я нашел статью, в которой это дело предлагается решить вот таким запросом:

SELECT *, MATCH field AGAINST ('$searchwords') as relev FROM $tbl ORDER BY relev DESC

работает. Но... почему-то то, что больше всего подходит по введенным данным просто перемещается вверх списка. Остальное выводится как есть.

Есть еще и другой вариант:

SELECT *, MATCH `b` AGAINST ('$searchwords') as relev FROM $tbl WHERE MATCH `b` AGAINST ('$searchwords')>0 ORDER BY relev DESC

в этом случае у меня ничего не выводится :-(

Помогите с составлением запроса

спустя 35 минут [обр] Алексей В. Иванов(2/2861)[досье]
спустя 2 часа 36 минут [обр] NeiTrinO[досье]

Спасибо большое. Прочитал. Применил.
Но... что-то у меня до сих не получается искать по части слова.
То есть. Если запрос для поиска представляет собой целое слово - все отлично. А вот если задать для поиска нечто короче слова (например, "кр", для поиска слов "Красный", "Красивый" и т.д.). То есть запрос в этом случае совсем не срабатывает. Подскажите как быть?

Есть мысль объединить запрос SELECT * FROM $tbl WHERE MATCH (`a`) AGAINST ('красная'); с таким: SELECT * FROM $tbl WHERE `a` LIKE '%кр%' (он как раз и ищет по части слов, но не сортирует по релевантности). Пробовал объединить из через HAVING, но что-то не получилось. Подскажите как и что

спустя 15 минут [обр] Алексей В. Иванов(2/2861)[досье]
Для русского языка я не нашел ничего лучше, чем использовать "BOOLEAN MODE" (см. там же), добавляя к словам "*".
спустя 1 час 34 минуты [обр] NeiTrinO[досье]

хе =) а я мучался, мучался. Не могу понять, почему у меня не работает в "BOOLEAN MODE". Оказывается, надо было обновить ПО (в чатсности мускуль)

Теперь все отлично, НО: как сделать запрос нечувствительным к регистру. То есть, когда запрашиваю, например "Кр" - одни результаты выдаются, а когда "кр" - другие =) Мне надо чтоб и те и те. Ну, естественно, чтоб при совпадении и регистра и релевантность больше была. Не подскажете как с этим быть?

спустя 29 минут [обр] Алексей В. Иванов(2/2861)[досье]
MySQL производит поиск без учёта регистра. Ваша проблема, скорее всего, из-за неправильной кодировки, указанной для соединения(?).
спустя 14 минут [обр] NeiTrinO[досье]

знаете... я тут сейчас проводил тестирование работы запроса. Что-то не так...
может я все-таки неправильно сформировал запрос? Он у меня получился вот такой:

$query = "SELECT * FROM $tbl WHERE MATCH (a) AGAINST ('+$sw*' IN BOOLEAN MODE);";

кстати, на счет учета регистра я ошибся. Все в норме. Не в норме вот что: все-таки не упорядочиваются результаты по релевантности :-(

и вот еще. Например, в полях БД имеются адреса:

ул. Московская 48, кв. 15
ул. Сормовская 24, кв. 28
ну и так далее.
При различныз запросах оказывается, что можно найти только название улицы (т.е. запрос типа "Моск" проходит, а запрос типа "кв. 15" - ничего не выдает)

спустя 20 минут [обр] NeiTrinO[досье]
виноват =) с сортировкой все нормально. А вот проблема с тем, что запрос типа "кв. 15" не проходит до сих пор меня волнует
спустя 24 минуты [обр] Алексей В. Иванов(2/2861)[досье]
Для MySQL "кв. 15" — два слова "кв" и "15". Оба они меньше 4-х символов (если не ошибаюсь, это минимальный размер слова для поиска по умолчанию).
см. Тонкая настройка полнотекстового поиска в MySQL
спустя 16 часов [обр] NeiTrinO[досье]
  1. Ну тогда понятно. Я просто думал, что мускулю все равно два это слова или одно. Спасибо =)
спустя 17 часов [обр] NeiTrinO[досье]
ну, наверное, тогда тему можно закрывать. Ответы я отрейтинговал =)
Powered by POEM™ Engine Copyright © 2002-2005