Варианты поискового движка на mysql-запросах

mYxuS

Новичок
Варианты поискового движка на mysql-запросах

Задача: находить по запросу "АААБББ" столбец "%ААА-БББ%".

Я вижу 2 варианта:
1. при загрузке найти все совпадения подобного рода и превратить все АААБББ в ААА-БББ. Это даст тормоза на загрузке. База большая.
2. для каждого из значащих для поиска столбцов (ищем в прайс-листе) завести столбец-дубль, в котором стереть все разделители (' ', '-', '—' etc). И потом при поиске сравнивать поискоый запрос с ... ну понятно. Этот вариант даст увеличение БД в 2 раза.

Что посоветуете? Какой вариант быстрее, какой глупее? Какие есть ещё?
 

voituk

прозревший
Посоветуем не изобретать велосипед, и взять уже готовое решение.
Например mnogoSearch
 

mYxuS

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

PS. посмотрел многосёрч. здоровый какой, со своими формами результатов. индексацией доков, pdf-ов.. не, для меня слишком громоздкий. у меня задача уже.
 

440hz

php.ru
mYxuS
уж точно mnogosearch переплюнет твой самопис и по скорости и по размерам судя по тому как ты с этой проблемой разбираешься + у него индексатор внешний + морфология.
 

mYxuS

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

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

PHP:
$keywords = Array();
...
$select_str ='SELECT * FROM tbl_name WHERE 1';
foreach($keywords as $word) { 
  $select_str .= ' && (';
  $select_str .= 'field1 LIKE "%'.$word.'%"';
  $select_str .= ' || 'field2 LIKE "%'.$word.'%"';
  ......................
  $select_str .= ')';
}
$sql = mysql_query($select_str);
тоесть прямой запрос. быстрее некуда, насколько я понимаю.
 

voituk

прозревший
mYxuS
А теперь сделай поиск по 100 МБ докуметов таким образом:)

-~{}~ 03.03.06 18:34:

$select_str .= ' || 'field2 LIKE "%'.$word.'%"';
Это что за мода такая пошла писать в sql-запросах "||" вместо "or"
 

mYxuS

Новичок
у меня нет никаких документов.. в каждом случае поиска у меня одна таблица на полмега. всё.
 

alienzzzz

интернет бизнес
mYxuS
так, про между прочим.
Функция LIKE это сто процентный Фулскан !
и того .по скольким параметрам ищем .... например 3 =) и значит три фулскана. пользователи просто не дождутся.
__
Если уж решил изобретать велик, то уж посмотри доку к Мускулу. там есть контекстный поиск.
__
Я в свое время писал на нем. работает быстро, только база возростает, но это сейчас помоему не проблема.
__
Хотя .... зачем я это говорю .
 

mYxuS

Новичок
На сайте mysql есть описание всяких функций. Мне, например, понравился replace, но как её встроить в нужный мне запрос - ума не приложу.

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

2. LIKE - фулскан.. пардон, а как иначе? Чем кроме аналогов strpos() можно добиться поиска нужного клочка строки? Насколько я понимаю, ничем. Никакая индексация, при такой постановке задачи, меня не спасет. (кстати сейчас запрос выполняется милисекунды).

Всё бы ерунда. Но мне очень нужно получить ответ на п.1 моего вопроса.
 

!diss

Новичок
Re: Варианты поискового движка на mysql-запросах

Автор оригинала: mYxuS
Задача: находить по запросу "АААБББ" столбец "%ААА-БББ%".
Что посоветуете? Какой вариант быстрее, какой глупее? Какие есть ещё?
Сделать 2 таблицы 1-я индекс слова, 2-я вхождение слов в документы. Убъете много зайцев, возможность подключить морфологию, возможность построения сложных запросов. Выборка будет происходить в 2 запроса 1 - получение кодов слов, 2 - получение документов по данным кодам. (можно конечно всё в один запихнуть, но смыла не вижу). А таблицу слов формировать с учетом Ваших приколов без -, _ и т.п. Выборку по сложным запросам можно сформировать сам на себя т.е.
Например пользователь запросил "салон красоты", получаете коды слов "салон" - 10 и привязанную морфологи. "салоны" - 11, "салону" - 12 и "красоты" - 24 и морфологию "красота" - 25, "красоте" - 16 и т.п из таблицы кодов слов и выбираете из таблицы индекса документов следующим образом.
SELECT doc_id, count(doc_id) AS kwi FROM `doc_keys`AS mt
INNER JOIN `doc_keys` AS T1 ON T2.doc_id = mt.doc_id
.....и т.д. по количеству слов в запросе.....
WHERE mt.keyword_id IN (10,11,12)
AND T1.keyword_id IN (24,25,16)
.....и т.д. по количеству слов в запросе.....
GROUP BY mt.doc_id
ORDER BY kwi DESC

ещё и сортировку по релевантности получите.
 

Сергей Тарасов

Профессор
Человек предлагает идею отдаленно напоминающую идею построения всех современных ИПС.
Из количественных решений можно посоветовать создание полнотекстовых индексов.
 

mYxuS

Новичок
Спасибо.
Хотя описал тот же подход самым первым постом, в пункте 2. (только я предлагал писать слова-без-разделителей соседним столбцом). Я уже раз 7 написал что я ищу только по одной таблице, по стандартному прайсу (нет морфологии, нет никаких вариантов написаний кроме с_разделителями и без_разделителей). Но по крайней мере это предложение подтвердило меня в мысли о дублировании данных..

Абстрактный вопрос. Как производится "привязка по морфологии"? Вижу 2 варианта:
1. при внесении слова пытаться автоматически предвидеть все возможные его приставки и окончания.
2. при поиске просто отрезать длинным словам из запроса 2 и 3 буквы с конца (что не всегда корректно).
 

!diss

Новичок
Автор оригинала: mYxuS
Абстрактный вопрос. Как производится "привязка по морфологии"?
Почитайте про стемминг и используйте эти словари _ttp://www.artint.ru/projects/frqlist.asp
или вот ещё вариант _ttp://linguist.nm.ru/ling/rus/help.htm
 

Spear

почемучка
!diss
что-то я не понял.
То есть нужно иметь таблицу, в которй будет указываться в одном поле каждое слово, а во втором - документы, в которых оно встречается? То есть, например, при публикации новости мне нужно засунуть в эту таблицу каждое слово из новости и поставить айдишник новости, в которых стречалось это слово? Если так, что сколько будет весить така таблица информационном портале? пару терабайт/? ))))))
 

!diss

Новичок
Автор оригинала: Spear
!dissчто-то я не понял.То есть нужно иметь таблицу, в которй будет указываться в одном поле каждое слово, а во втором - документы, в которых оно встречается?
Нет, в таблице будет id слова (MEDIUMINT) и id страницы (MEDIUMINT)

Так речи о больших объемах не идёт (объём таблицы будет примерно равным объёму данных), для серьёзных проектов есть серьёзные решения.

ЗЫ: стоп слова не хранятся.
 

Spear

почемучка
!diss
а что посоветуете для больших объёмой БД и ольшом кол-ве записей?
 

!diss

Новичок
Автор оригинала: Spear
!diss
а что посоветуете для больших объёмой БД и ольшом кол-ве записей?
Честно говорю из стандартных ничем не пользовался, поэтому и советовать не могу.
 
Сверху