Нормальный поиск - нужен хэлп по селекту

Space

Новичок
Нормальный поиск - нужен хэлп по селекту

1. есть свыше 60 тыс. текстовых записей в таблице:

table:
b_data
fields:
id,title,text
ну и еще всякая муть(для примера она нам не нужна)

2. так же есть хэш таблица, содержащая правильные формы слов. слова взяты из словаря, а так же пополненны из различных текстов.
вид:
CREATE TABLE `b_dict_word` (
`id` mediumint(10) NOT NULL default '0',
`name` varchar(40) NOT NULL default '',
`hash` varchar(32) NOT NULL default '',
`len` smallint(2) NOT NULL default '0',
`new` smallint(1) NOT NULL default '0',
UNIQUE KEY `id` (`id`),
KEY `hash` (`hash`)
) TYPE=MyISAM;
слов свыше 100 000

3. так же есть таблица которая поясняет какое слово из таблицы `b_dict_word` встречается в b_data
т.е. суть такая:
слово word_id=10 - электронный
встречается в записях data_id=1,data_id=2...

4. ее вид таков:
CREATE TABLE `b_dict_link` (
`word_id` mediumint(10) NOT NULL default '0',
`data_id` mediumint(20) NOT NULL default '0',
`place` smallint(3) NOT NULL default '0',
KEY `word_id` (`word_id`,`data_id`)
) TYPE=MyISAM;

теперь представим, пользователь ищет
"кофеварка зеленая"
мы переводим эти два слова в нормальный вид:
"кофеварка зеленый" и ищем совпадения в хэш таблице

у меня получается выбрать записи когда введено одно слово, тогда я делаю:
$HASH = md5("кофеварка");
$HASH2 = md5("зеленая");

$QUERY="
select
w.id,w.name,w.hash,w.len
from b_dict_word as w
LEFT JOIN b_dict_link as l ON (l.word_id=w.id)
LEFT JOIN b_data as d ON (d.id=l.data_id)
WHERE w.hash='".$HASH."'
";
как мне дописать этот запрос что бы запись из таблицы b_data содержала 2 искомых слова сразу?
 

chira

Новичок
зачем тебе объединение с таблицей b_data?
Код:
select
w.id,w.name,w.hash,w.len, COUNT(DISTINCT l.data_id) cn_data
from b_dict_word as w
LEFT JOIN b_dict_link as l ON (l.word_id=w.id)
WHERE w.hash IN ('".$HASH."','".$HASH2."')
GROUP BY w.id
HAVING cn_data =2
 

Space

Новичок
chira

таблица b_dict_link служит связующим звеном между b_dict_word и b_data

объясню несколько проще:

1. есть таблица сайтов, где каждая запись содержит текст
2. есть таблица слов - своего рода словарь
3. так же есть таблица, которая поясняет какое слово в каком сайте содержится.

поясняющая таблица b_dict_link образуется(заполняется) благодаря анализу описания сайта - т.е. выдергиваются все слова,они поочередно сравниваются со словарем(если их там нет - анализируем/добавляем) и заносим ссылку что дескать в этом сайте такое слово.

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

select d.id,d.title,d.desc,d.url, COUNT( l.data_id ) AS cnt,l.place, w.id,w.name,w.hash,w.len from b_dict_word as w LEFT JOIN b_dict_link as l ON (l.word_id=w.id) LEFT JOIN b_data as d ON (d.id=l.data_id) WHERE w.hash='d41d8cd98f00b204e9800998ecf8427e' or w.hash='e0284965be1ee60699226985f3614413' or w.hash='b1f8e2843bb146ed59b5c84c32fcaf43' and d.title<>'' GROUP BY l.data_id ORDER BY cnt DESC

за твой запрос спасибо - приму на рассмотрение..
 

chira

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

Space

Новичок
chira
пожалйста, без драк :) я просил одно, и сделал даже лучше.. в результатах поиска выдаются сначала те записи в которых найденны 2 эти слова - а потом одно из этих слов..
>> запись из таблицы b_data содержала 2 искомых слова сразу
значит если человек набрал в поиске 2 слова - то сайт бы показывался на первом месте в результатах - либо был единственным. но подумав, я решил что не стоит ограничивать результат как "единственный"

респект
 

chira

Новичок
ни кто и не дерется ... :)
похоже, ты вопрос по ходу формулируешь ..
если у тебя слово "кофеварка" встречается в одной записи 10 раз но ни одной "зеленой", то на первом месте у тебя будут не "зеленые кофеварки" а металолом с десятью "кофеварками".

-~{}~ 17.04.04 19:30:

это если я правильно понял структуру таблицы:
CREATE TABLE `b_dict_link` (
`word_id` mediumint(10) NOT NULL default '0',
`data_id` mediumint(20) NOT NULL default '0',
`place` smallint(3) NOT NULL default '0',
KEY `word_id` (`word_id`,`data_id`)

-~{}~ 17.04.04 19:33:

если двух "кофеварок" в одной записи не может быть, то все нормально ...
учитывая KEY `word_id` (`word_id`,`data_id`)
 
Сверху