2013-04-15 4 views
0

У меня есть две таблицы в данный момент:MySql Заказанный Поиск по ключевой фразе

search_matches:

match_id (int) <-- primary key 
parent_id (int) <-- foreign-key 
word_id (int) <-- foreign-key (to a table filled with words that are unique and have an id) 
pos (int) <-- the position of the word in the block of text it comes from 

search_words: (обновление)

word_id (int) <-- primary key 
word (varchar ...) <-- the word 

(я использую InnoDB, и мой хозяин выиграл» t update mysql, так что полный текст отсутствует)

Я бы хотел, чтобы мои пользователи могли выполнять поиск с использованием ". arch для «foo bar».

Я думал несколько способов сделать это, но не менее интенсивно, как представляется, добавив еще один столбец:

next_pos (int) 

я мог тогда сделать

(SELECT * FROM table WHERE word_id='foo') as foo 
INNER JOIN (SELECT * FROM table WHERE word_id='bar') AS bar 
ON (
    foo.parent_id=bar.parent_id AND 
    foo.next_pos=bar.next_pos 
) 

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

Это мой лучший вариант, или есть другой ? там я все еще просто играть в постановке, так что теперь пришло время внести изменения


Update 1:.

Я сейчас рассматривает возможность использования таблицы ключевых слов, чтобы сузить свой поиск, а затем с помощью как на этом, а не на нескольких объединениях, поскольку это может быть еще быстрее и значительно устраняет необходимость объединения. Просто не было бы продуктивным делать по всей моей базе данных.

ответ

-1

Я не вижу, как вы собираетесь выполнять этот поиск с вашей текущей настройкой. Если, как вы говорите, у вас есть таблица, содержащая только УНИКАЛЬНЫЕ слова из блока текста, как бы вы ожидали связать этот список уникальных слов с фактическим размещением слов в полном содержании? Например, исходное содержимое выглядело так:

some text with foo and also with foo bar 

Вы бы выбрали уникальный стол для текста?

word_id word 
-------------- 
1   some 
2   text 
3   with 
4   foo 
5   and 
6   also 
7   bar 

Если да, то как вы когда-нибудь найти foo и bar как смежных записей?

Я предполагаю, что ваша база данных также имеет где-то полный контент, так почему бы просто не искать в содержании, используя LIKE?

+0

Таблица уникальных значений - это просто первичный автоматически увеличивающий ключ (word_id) с другим столбцом (словом), который имеет текст.{1: некоторые, 2: текст, 3: с, 4: foo, 5: и, 6: также, 7: bar} Слова не повторяются. Я беспокоюсь, может быть, слишком дорого. – Kirk

+0

@Kirk Но если вам нужно искать по значимым подстрокам полного контента, нет никакого способа сделать это только с помощью словаря всех миров в содержании, если вы не знаете, что слова никогда не повторятся в этом контенте. –

+0

Есть две таблицы ... один словарь. Другой содержит ссылки на словарь с положением слова в тексте, из которого он поступает (pos) – Kirk

0

Я действительно не понимаю, почему вы хотите выполнить всю эту ручную работу. Есть инструменты, которые могут просто это сделать. Из того, что я читал, что вы хотите сделать, связано с полнотекстовым поиском. Вам не нужно создавать индекс самостоятельно.

Вы считаете, что используете что-то вроде SolR? Он хорошо работает с любыми БД, пока вы создаете индекс.

+0

К сожалению, мой хост не позволит мне делать это с помощью моего текущего пакета. – Kirk

Смежные вопросы