как реализовать поиск по 2 разным табличным данным?

Использование mysql и PHP

Я уже использую предложения MATCH AGAINST.

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

Я хочу иметь возможность искать и отображать результаты из разных таблиц на одной странице результатов.

Например, если я наберу "шоколадная одежда"

я могу получить 4 результата следующим образом:

Магазин1 результат

ShopItem1 результат

ShopItem2 результат

Магазин2 результат

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

у меня довольно много вопросов. как с точки зрения дизайна, так и с точки зрения реализации

1) я должен изменить свой дизайн? Я думаю о том, чтобы иметь отдельную таблицу под названием результаты поиска, которая будет содержать данные как из таблицы SHOPS, так и из таблицы SHOPPRODUCTS. однако это означает, что у меня есть дублирование данных.

2) должен ли я сохранить свой текущий дизайн? если да, то как я могу получить результаты поиска, отсортированные по релевантности в двух разных таблицах?

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

http://www.rottentomatoes.com/search/full_search.php?search=girl

ИЛИ это на самом деле лучший выход?

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

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

CREATE TABLE `shopitems` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `ShopID` int(10) unsigned NOT NULL,
  `ImageID` int(10) unsigned NOT NULL,
  `name` varchar(100) NOT NULL,
  `description` varchar(255) NOT NULL,
  `pricing` varchar(45) NOT NULL,
  `datetime_created` datetime NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;

/*Table structure for table `shops` */

DROP TABLE IF EXISTS `shops`;

CREATE TABLE `shops` (
  `id` int(11) NOT NULL auto_increment,
  `title` varchar(100) default NULL,
  `description` text,
  `keywords` text,
  `url` varchar(255) default '',

  `owner_id` varchar(255) default NULL,
  `datetime_created` datetime default NULL,
  `created_by` varchar(255) default NULL,
  `datetime_modified` datetime default NULL,
  `modified_by` varchar(255) default NULL,

  `overall_rating_avg` decimal(4,2) default '0.00',


  PRIMARY KEY  (`id`),
  FULLTEXT KEY `url` (`url`),
  FULLTEXT KEY `TitleDescFullText` (`keywords`,`title`,`description`,`url`)
) ENGINE=MyISAM AUTO_INCREMENT=3051 DEFAULT CHARSET=utf8;

я намерен выполнить поиск в столбцах описания и имени таблицы shopproducts.

но, как вы можете видеть, это еще не реализовано.

хотя поиск магазинов уже запущен и работает.


person Kim Stacks    schedule 26.09.2009    source источник
comment
добавление структур таблиц поможет получить хороший ответ   -  person Cem Kalyoncu    schedule 26.09.2009
comment
привет что ты имеешь в виду? Вы имеете в виду, что у меня должна быть отдельная таблица с именем search_results, которая содержит все существующие данные и выполняет сопоставление только на основе этой таблицы?   -  person Kim Stacks    schedule 26.09.2009
comment
Не проще ли использовать для полнотекстового поиска Sphinx или Xapian? Создание индекса с заданным интервалом и поиск только в нем значительно улучшит скорость поиска.   -  person unexist    schedule 30.09.2009
comment
Я не понимаю, что такое SPhinx. и как с помощью sphinx я могу отображать результаты поиска из 2 или более разных таблиц данных   -  person Kim Stacks    schedule 30.09.2009


Ответы (7)


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

  • Все индексы в MySQL могут ссылаться только на столбцы в одной базовой таблице. Вы не можете создать полнотекстовый индекс, который индексирует несколько таблиц.
  • Вы не можете определить индексы для представлений, только для базовых таблиц.
  • Запрос MATCH() к полнотекстовому индексу должен соответствовать всем столбцам полнотекстового индекса в порядке, объявленном в индексе.

Я бы создал третью таблицу для хранения контента, который вы хотите индексировать. Нет необходимости хранить это содержимое избыточно — храните его исключительно в третьей таблице. Это заимствует концепцию «общего суперкласса» из объектно-ориентированного проектирования (насколько мы можем применить его к проектированию СУБД).

CREATE TABLE Searchable (
  `id` SERIAL PRIMARY KEY,
  `title` varchar(100) default NULL,
  `description` text,
  `keywords` text,
  `url` varchar(255) default '',
  FULLTEXT KEY `TitleDescFullText` (`keywords`,`title`,`description`,`url`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `shopitems` (
  `id` INT UNSIGNED NOT NULL,
  `ShopID` INT UNSIGNED NOT NULL,
  `ImageID` INT UNSIGNED NOT NULL,
  `pricing` varchar(45) NOT NULL,
  `datetime_created` datetime NOT NULL,
  PRIMARY KEY (`id`),
  FOREIGN KEY (`id`) REFERENCES Searchable (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `shops` (
  `id` INT UNSIGNED NOT NULL,
  `owner_id` varchar(255) default NULL,
  `datetime_created` datetime default NULL,
  `created_by` varchar(255) default NULL,
  `datetime_modified` datetime default NULL,
  `modified_by` varchar(255) default NULL,
  `overall_rating_avg` decimal(4,2) default '0.00',
  PRIMARY KEY (`id`),
  FOREIGN KEY (`id`) REFERENCES Searchable (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Обратите внимание, что единственная таблица с ключом автоинкремента теперь Searchable. В таблицах shops и shopitems используется ключ с совместимым типом данных, но без автоинкремента. Таким образом, вы должны создать строку в Searchable, чтобы сгенерировать значение id, прежде чем вы сможете создать соответствующую строку в shops или shopitems.

Я добавил FOREIGN KEY объявлений для наглядности, хотя MyISAM молча проигнорирует эти ограничения (и вы уже знаете, что вы должны использовать MyISAM для поддержки полнотекстового индексирования).

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

SELECT S.*, sh.*, si.*,
  MATCH(keywords, title, description, url) AGAINST('dummy') As score
FROM Searchable S
LEFT OUTER JOIN shops sh ON (S.id = sh.id)
LEFT OUTER JOIN shopitems si ON (S.id = si.id)
WHERE MATCH(keywords, title, description, url) AGAINST('dummy')
ORDER BY score DESC;

Конечно, для данной строки в Searchable должна совпадать только одна таблица, либо магазины, либо товары, и эти таблицы имеют разные столбцы. Таким образом, либо sh.*, либо si.* в результате будет NULL. Вы должны отформатировать вывод в своем приложении.


Несколько других ответов предложили использовать Sphinx Search. Это еще одна технология, дополняющая MySQL и добавляющая более сложные возможности полнотекстового поиска. У него отличная производительность для запросов, поэтому некоторые люди были очарованы им.

Но создание индексов и особенно постепенное добавление к индексу обходится дорого. На самом деле обновление индекса Sphinx Search настолько затратно, что рекомендуется создать один индекс для более старых архивных данных и другой индекс меньшего размера для последних данных, которые с большей вероятностью будут обновлены. Затем каждый поиск должен выполнять два запроса по двум отдельным индексам. И если ваши данные естественным образом не поддаются шаблону неизменности старых данных, то вы все равно не сможете воспользоваться этим трюком.


Что касается вашего комментария: вот выдержка из документации Sphinx Search о живых обновления индекса:

Нередки ситуации, когда общий набор данных слишком велик для частой переиндексации с нуля, а количество новых записей довольно мало. Пример: форум с 1 000 000 заархивированных сообщений, но только 1 000 новых сообщений в день.

В этом случае «живые» (почти в реальном времени) обновления индекса могут быть реализованы по так называемой схеме «основной + дельта».

Идея состоит в том, что, поскольку обновление индекса Sphinx Search обходится дорого, их решение состоит в том, чтобы сделать индекс, который вы обновляете, как можно меньше. Так что только самые последние сообщения на форуме (в их примере), тогда как большая история архивных сообщений на форуме никогда не меняется, поэтому вы создаете второй, более крупный индекс для этой коллекции один раз. Конечно, если вы хотите выполнить поиск, вы должны запросить оба индекса.

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

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

Возьмем, к примеру, вашу базу данных: у вас есть магазины и товары. Как вы можете разделить их на строки, которые никогда не меняются, по сравнению с новыми строками? Любым магазинам или продуктам в каталоге должно быть разрешено обновлять свое описание. Но поскольку это потребует перестроения всего индекса Sphinx Search каждый раз, когда вы вносите изменения, это становится очень дорогостоящей операцией. Возможно, вы поставите изменения в очередь и примените их пакетно, перестраивая индекс раз в неделю. Но попробуйте объяснить продавцам магазина, почему небольшое изменение в описании их магазина вступит в силу только в воскресенье вечером.

person Bill Karwin    schedule 03.10.2009
comment
Обычно я не советую использовать селектор * в результате запроса. На первый взгляд это может показаться хорошей идеей, но обычно это затрудняет прямую совместимость с программным обеспечением, которое должно работать с результатом. - person Matthieu M.; 04.10.2009
comment
@Matthieu M: Да, я согласен, я использую подстановочный знак только в специальных запросах и примерах для StackOverflow. Я не использую подстановочный знак для производственного кода. Но эта проблема ортогональна вопросу полнотекстового поиска. - person Bill Karwin; 04.10.2009
comment
Привет Билл, спасибо за ваш ответ. Это очень ясно, и это освещает. Однако у меня есть несколько вопросов о Sphinx Search. На самом деле, обновление индекса Sphinx Search настолько затратно, что рекомендуется создать один индекс для более старых архивных данных и другой индекс меньшего размера для последних данных, которые с большей вероятностью будут обновлены. Затем каждый поиск должен выполнять два запроса по двум отдельным индексам. И если ваши данные естественным образом не поддаются шаблону неизменности старых данных, то вы все равно не сможете воспользоваться этим трюком. вы можете уточнить эту часть? - person Kim Stacks; 04.10.2009
comment
вау спасибо Билл! И я думал, что единственная проблема, с которой я столкнулся при использовании Sphinx, заключается в том, что его нельзя использовать на виртуальном хостинге, а не на site5. Я знаю, что еще не сталкивался с этой проблемой, но что, если через некоторое время у меня возникнут проблемы с масштабированием. Что я должен учитывать, чтобы мой полнотекстовый поиск был хорош ДАЖЕ для одной базовой таблицы, такой как магазины? - person Kim Stacks; 05.10.2009
comment
Я думаю, что на веб-сайтах малого и среднего размера следует использовать внешнее решение для поиска, такое как Пользовательский поиск Google (google.com/cse) или Yahoo Build Your Own Search Service (разработчик. yahoo.com/search/boss) вместо того, чтобы пытаться реализовать полный поиск собственными силами. Пусть кто-то другой поддерживает железо для масштабируемого поиска! Все, о чем вам нужно беспокоиться, — это сделать ваш сайт оптимизированным для SEO. - person Bill Karwin; 05.10.2009
comment
Это первый раз, когда я слышу это о пользовательском поиске Google и Yahoo BOSS. Извините, что беспокою вас. Мне нужно свести к минимуму время экспериментов с еще одним материалом, с которым я не знаком. Но разве они не просто индексируют веб-страницу? Как такая служба может индексировать данные в моей собственной базе данных? Я действительно смущен этим. - person Kim Stacks; 06.10.2009
comment
Вы когда-нибудь использовали Google с синтаксисом site:, чтобы результаты включали только URL-адреса, соответствующие указанному вами шаблону сайта? Так что, если бы вы могли включить текстовое поле поиска на своей веб-странице, которое вызывает Google, ограничивает поиск вашим сайтом и, возможно, даже другими предварительно выбранными параметрами, которые вы хотите? И тогда вы также можете интегрировать результаты поиска на свою страницу. Это идея. Это также зависит от индексации вашего сайта Google (или Yahoo, если вместо этого вы используете BOSS), и это работает лучше, если вы спроектируете свой сайт так, чтобы каждый магазин и товар имели свою собственную страницу с красивым URL-адресом. - person Bill Karwin; 06.10.2009
comment
Это концепция. На каждом из сайтов, на которые я ссылался, есть учебные пособия, которые могут объяснить, как их использовать лучше, чем я. У них есть пример кода и т.д. - person Bill Karwin; 06.10.2009
comment
Я понимаю. Благодарю. потому что в настоящее время я показываю результаты поиска, такие как этот PIC элемента, за которым следует короткое описание, за которым следуют некоторые ссылки на определенные действия, такие как просмотр и т. д. Позволят ли эти пользовательские поиски отображать результаты поиска в моем собственном формате? - person Kim Stacks; 07.10.2009
comment
Google CSE имеет довольно фиксированный формат, очень похожий на их обычные результаты поиска. Yahoo BOSS больше похож на веб-сервис, поэтому вы можете получать структурированные результаты в формате XML или JSON, а затем представлять их в удобном для вас формате. Если у вас есть более конкретные вопросы об этих службах, я предлагаю вам прочитать их документы и учебные пособия, попробовать их, а затем, возможно, открыть новый вопрос о них в StackOverflow. - person Bill Karwin; 07.10.2009
comment
спасибо Билл. Вы были очень полезны. Вы заслужили от меня много благосклонности, а не только мои очки. - person Kim Stacks; 07.10.2009
comment
Спасибо, я рад помочь. По стечению обстоятельств на этой неделе я разрабатываю презентацию о решениях для текстового поиска для конференции PostgreSQL West в Сиэтле. Позже я опубликую слайды на slideshare.net/billkarwin. Кстати, я нашел хорошую оболочку Javascript для использования Yahoo BOSS: icant.co.uk/sandbox/yboss< /а> - person Bill Karwin; 07.10.2009

Я не уверен, что правильно понял, но вот мои 2 цента.

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

  • для магазинов: название, описание и ключевые слова
  • для shopitems: название и описание

Решение 1. Согласованность макета — не используется индекс...

Если бы вы могли каким-то образом изменить название ваших столбцов для товаров, это сразу стало бы намного проще.

Select id From
(Select id, text1, text2, text3 From table1
 UNION
 Select id, text1, text2, text3 From table2)
Where MATCH(id, text1, text2, text3) AGAINST('keyword1 keyword2 keyword3')

Однако я понимаю, что менять все, что уже существует, было бы нецелесообразно. Обратите внимание, что с псевдонимом добавление третьего (фиктивного) текстового столбца к shopitems может помочь.

Решение 2. Последующая обработка

Я должен отметить, что вычисленное значение действительно может быть возвращено (и, таким образом, использовано). Поэтому вы можете создать временную таблицу с этим значением! Обратите внимание, что если вы хотите вернуть «название» и «описание», оба столбца должны иметь один и тот же тип, чтобы обрабатывать их единым образом...

Select id, title, description From
(
 Select id, title, description, MATCH(id, title, description, keywords) AGAINST('dummy') As score
        From shops
        Where MATCH(id, title, description, keywords) AGAINST('dummy')
 UNION
 Select id, name As title, description, MATCH(id, name, description) AGAINST('dummy') As score
        From shopitems
        Where MATCH(id, name, description) AGAINST('dummy')
)
ORDER BY score DESC

Я понятия не имею о производительности этого запроса, однако мне интересно, оптимизирует ли mysql двойной вызов MATCH / AGAINST в каждом из Selects (я надеюсь, что это так).

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

В любом случае, я надеюсь, что это помогло вам.

person Matthieu M.    schedule 02.10.2009
comment
Благодарю. я думаю, что ваш ответ, по крайней мере, имел больше смысла, чем другие ответы. я по крайней мере дам вам голос. Другие ответы, я чувствую, стрелять из бедра ... разочаровывают. - person Kim Stacks; 02.10.2009
comment
Оба ваших решения имеют проблему конфликта идентификаторов, но это можно решить, добавив еще одно поле в каждую таблицу и указав имя таблицы в этом поле для всех ее строк. однако это также означает, что когда я отображаю свои результаты на веб-странице, мне нужно снова получить всю связанную информацию для всех, поскольку у меня есть только идентификатор. - person Kim Stacks; 02.10.2009
comment
Да, проблема двойного извлечения раздражает, поэтому я предложил попробовать сделать более похожие макеты таблицы, если это возможно. Обратите внимание, что во втором решении вы можете попросить получить дополнительную информацию (название, описание) и сгладить различия путем сглаживания. Я могу попытаться найти более полное решение, если вы скажете мне, какие строки вам нужны для каждой из ваших таблиц и какие изменения вы готовы внести в структуру ваших таблиц. - person Matthieu M.; 02.10.2009

Я предлагаю вам первый вариант. Избыточность — не всегда зло.

Поэтому я бы сделал такую ​​таблицу:

CREATE TABLE search_results
(
   ...
   `searchable_shop_info` VARCHAR(32),
   `searchable_shopitem_info` TEXT
   FULLTEXT KEY `searchable` (`searchable_shop_info`, `searchable_shopitem_info`)
) Engine=MyISAM;

Тогда вы все еще можете использовать SELECT * FROM search_results WHERE MATCH (searchable_shop_info,searchable_shopitime_info) AGAINST ('search query string');

person Ifju    schedule 26.09.2009
comment
могу я спросить, почему вы рекомендуете это другим вариантам? - person Kim Stacks; 26.09.2009

Если я правильно понял ваши вопросы, ответ очень прост:

  1. Не меняйте дизайн. Это прекрасно. Вот как это должно быть.
  2. Сделайте объединенный запрос следующим образом:
SELECT * FROM shops
LEFT OUTER JOIN shopitems ON (shopitems.shopid = shops.id)
WHERE 
    MATCH (shops.title, shops.description, shops.keywords,
           shopitems.name, shopitems.description) 
    AGAINST ('whatever text')
person Slawa    schedule 30.09.2009
comment
1) вы неправильно понимаете. 2) запрос вообще не работает, не говоря уже о целях моего вопроса. - person Kim Stacks; 01.10.2009

Я бы пошел в СОЮЗ. Это цель заявления.

person Teo    schedule 03.10.2009

Я бы выбрал ваш первый вариант, создав отдельную таблицу поиска.

Мы сделали это однажды, когда нам нужно было искать данные в нескольких SOA-системах.

Преимущества этого подхода:

  • более быстрый ответ на поисковые запросы
  • больше контроля над организацией результатов поиска

Недостатки:

  • более медленное время сохранения данных, так как они должны быть записаны в двух местах
  • дополнительное пространство, используемое для хранения данных
person Shiraz Bhaiji    schedule 03.10.2009

хм, может быть, вы можете использовать союз? нравится

create table search1 (
    title varchar(12), 
    relavency tinyint unsigned
);

create table search2 (
    title varchar(12), 
    relavency tinyint unsigned
);

insert into search1 values (substring(md5(rand()), 1, 12), (rand()*100)), 
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100));

insert into search2 values (substring(md5(rand()), 1, 12), (rand()*100)), 
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100)),
(substring(md5(rand()), 1, 12), (rand()*100));

(select *, 'search1' as source from search1) 
union (select *, 'search2' as source from search2) 
order by relevancy desc;

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

альтернативный текст

ОБНОВЛЕНИЕ 1:

хорошо, я уже перечитал ваш вопрос и комментарий ... я думаю

1) я должен изменить свой дизайн? Я думаю о том, чтобы иметь отдельную таблицу под названием результаты поиска, которая будет содержать данные как из таблицы SHOPS, так и из таблицы SHOPPRODUCTS. однако это означает, что у меня есть дублирование данных.

я думаю, что вместо этого вы должны использовать представление, чтобы содержать данные из обеих таблиц, поскольку представление будет автоматически «обновляться» при изменении ваших данных. если вы используете таблицу, вам, вероятно, потребуется обновить ее самостоятельно.

CREATE VIEW viewSearch (Title, Relavency, SourceTable) AS 
(SELECT title, relavency, 'search1' as source FROM search1
ORDER BY relavency DESC
LIMIT 10)
UNION 
(SELECT title, relavency, 'search2' as source FROM search2
ORDER BY relavency DESC
LIMIT 10)
ORDER BY relavency DESC 
LIMIT 10;

альтернативный текст

2) должен ли я сохранить свой текущий дизайн? если да, то как я могу получить результаты поиска, отсортированные по релевантности в двух разных таблицах?

с помощью SQL/View выше вы можете. в основном путем размещения

...
ORDER BY relavency DESC 
LIMIT 10

мне интересно. это означает, что мне нужно запускать этот запрос КАЖДЫЙ РАЗ для любого ввода поиска. потому что разные входные данные будут иметь разные оценки релевантности.

я действительно не понимаю, что ты имеешь в виду? если бы вы сейчас искали между двумя таблицами, разве вы не делали бы 2 отдельных SQL-запроса (по 1 для каждой таблицы)? или если бы вы выбрали результаты в 1 таблицу, это все еще ... на самом деле 3 запроса (2 для выбора в таблицу результатов, затем 1 для запроса).

Я также добавил ORDER BY & LIMIT в каждый SELECT, чтобы ускорить процесс за счет получения меньшего количества записей. затем ORDER BY & LIMIT еще раз в целом.

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

Возможно, мне немного не хватает понимания. я подозреваю, является ли ваш метод ресурсоемким. Пожалуйста, просветите меня. Я готов рассмотреть все возможности.

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

о, и я также не очень знаком с полнотекстовым поиском, поэтому я не знаю, повлияет ли этот метод на что-либо

person iceangel89    schedule 26.09.2009
comment
мне интересно. это означает, что мне нужно запускать этот запрос КАЖДЫЙ РАЗ для любого ввода поиска. потому что разные входные данные будут иметь разные оценки релевантности. Возможно, мне немного не хватает понимания. я подозреваю, является ли ваш метод ресурсоемким. Пожалуйста, просветите меня. Я готов рассмотреть все возможности. - person Kim Stacks; 26.09.2009
comment
Спасибо за ваши старания. но вы не выполняли полнотекстовый поиск, поэтому я не думаю, что вы видите проблему. Я совершенно уверен, что вы не можете выполнять полнотекстовый поиск в VIEW. - person Kim Stacks; 27.09.2009
comment
хм, хорошо, я не знаю, как вы будете вести таблицу результатов. но я думаю, что триггеры будут вариантом - person iceangel89; 27.09.2009
comment
я не думаю, что вы вполне понимаете мои цели таблицы search_results. они просто клоны данных в магазинах и таблице продуктов магазина. Плохо то, что когда я обновляю магазины ИЛИ продукты магазина, мне приходится обновлять ОБА таблицу магазинов и таблицу search_results. хорошо, что как-то проще искать в одной таблице, а не в двух таблицах, и соответственно отображать результаты. - person Kim Stacks; 27.09.2009
comment
я имею в виду, что вы можете использовать триггеры для обновления таблицы результатов при обновлении таблицы магазинов или продуктов. - person iceangel89; 28.09.2009
comment
о, и я также не совсем знаком с полнотекстовым поиском, поэтому я не знаю, повлияет ли этот метод на что-либо, тогда спасибо за попытку. но я бы предпочел, чтобы вы не дали свой ответ тогда. - person Kim Stacks; 02.10.2009