Морфологический поиск по базе

mit

Новичок
Морфологический поиск по базе

Как реализовать морфологический поиск по базе? Может кто знает?
 

vadim

Guest
А можно точно уточнить, что вы понимаете под "морфологическом поиском".
И про какую базу идёт речь?
 

mit

Новичок
Морфология: чтобы можно было находить похожие слова (Иванов, Иванова, Ивановы). Вообщем так же как реализовано в YANDEX.RU.
База - MySQL.
 

vadim

Guest
Советую в любом случае вот эту главу из манула: http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html
Также есть мощная конструкция: LIKE '%word%'
 

Popoff

popoff.donetsk.ua
mit
Я знаю. У меня реализовано. Мной. В двух словах не расскажешь. У меня все основано на словаре Лебедева.
 

Mich

Продвинутый новичёк
Стеммер Портера: http://snowball.tartarus.org/algorithms/russian/stemmer.html

-~{}~ 08.03.06 23:26:

Где-то были и реализации на PHP.
 

Develar

Новичок
Словарь Лебедева (ispell) можно для удобства и скорости перевести в БД и искать в полученной таблице.
[sql]SELECT sp1.form FROM spell sp1, spell sp2 WHERE sp1.word=sp2.word AND sp2.form='$1'[/sql] получаем нужное. Таблица весит 80 Мб, 1,399,201 записей.

Также почитать http://phpclub.ru/detail/magazine/2004/10/
 

Mich

Продвинутый новичёк
Develar, и сколько времени занимает на твоей машине поиск, если нетрудно?
 

clevel

Новичок
Mich, реализовал аналогичную схему:
есть таблица id,word,parent
стоит индекс (10 символов) на word.
При поиске я ищу с помощью IN('раз','два','три')..
Для страниц - есть индекс id первослов в отдельной таблице, при поиске - я только id первослов нахожу и потом уже с int работаю...
так что скоркость - сотые доли секунды..
 

kruglov

Новичок
В ispellе многого нет, так что лучше его поддерживать эвристическим генератором окончаний. Пускай этот генератор придумает несуществующие слова - они все равно на сайте не найдутся.

Вот http://www.managee.ru/ru/search/ - тут у меня поиск по ispell + придумыватель окончаний для несуществующих слов. Есть отладочный вывод сгенеренного MySQL-запроса
 

kruglov

Новичок
Вообще, ispell в морфологическом поиске применяется "от бедности", он предназначен совсем для другого. Есть мысль сделать из него "словарь парадигм" - скажем, окончаний слов буквы в 2-3-4 длиной. И среди них уже и искать.
 

Popoff

popoff.donetsk.ua
Вообще, ispell в морфологическом поиске применяется "от бедности", он предназначен совсем для другого
На самом деле да. Я хотел об этом сказать, но подумал, что вопрошающему для начала такого варианта будет достаточно.
 

Slalom+

Новичок
Попробуй релевантный поиск. Мне помогает:

SELECT *, MATCH (firstName, lastName)
AGAINST('{$_POST['searchWord']}*' IN BOOLEAN MODE) AS rel
FROM users
WHERE MATCH (firstName, lastName)
AGAINST('{$_POST['searchWord']}*' IN BOOLEAN MODE)
ORDER BY rel DESC

Поля firstName and lastName в таблице БД должны быть как fullText. Не обязательно должно быть два поля, можно и одно и больше...
 

kruglov

Новичок
Slalom+
Этот "релевантный поиск" найдет электронную почту при поиске "электрон" и комплименты при поиске "комп"
 

Slalom+

Новичок
kruglov
Для поиска однородных данных таких как имена пользователей (Иванов, Иванова, Ивановы) какраз подойдет. И отсортирует по наиболее подходящей записи.
 

kruglov

Новичок
Slalom+
Да? А я не искал "Иванов", а искал "Ивановым". У меня "Иванов" найдётся?

Про сортировку это все понятно, это в мануале про MATCH доходчиво написано.
 
Сверху