2012-02-03 5 views
1

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

База данных состоит из названий отелей, продуктов питания для гостиниц, гостиниц.

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

Есть ли общий алгоритм поиска или пакеты, которые можно использовать?

ОЖИДАЕМЫЕ РЕЗУЛЬТАТ SET:

идентификатор | имя | описание | table_name | ранг

56 | KFC | Жареная курица | отель | 1

12 | [название пищевой продукции] | [описание продукта] | food_item | 2

19 | [название отеля] | [описание отеля] | отель | 3

....

+1

зависит, насколько сложным вы хотите получить, и какие базы данных ты используешь. – dqhendricks

+0

Я использую mysql –

ответ

1

Если вы используете Microsoft SQL Server, FREETEXT работает очень хорошо:

http://msdn.microsoft.com/en-us/library/ms176078.aspx

+0

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

+0

http://devzone.zend.com/26/using-mysql-full-text-searching/ –

+0

В ответе упоминается «Свободный текст», который существует только в Microsoft SQL Server. Попробуйте приведенную выше ссылку для полнотекстового поиска с MySQL –

2

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

Вы хотите найти контекстуальный? Lucene - отличная реализация поисковой системы, написанная на Java. Это может помочь вам выйти за него замуж с Lucene:

http://www.cabotsolutions.com/2009/05/using-solr-lucene-for-full-text-search-with-mysql-db/

Ответ гораздо сложнее, если вы думаете о сканировании веб-сайтов на основе некоторых критериев. Просьба уточнить.

+0

Я сегодня не видел лучшего ответа. +1 – Mob

+0

Нет. Я не имею в виду предложение «где». Я бы хотел, чтобы мои результаты поиска оценивались в зависимости от строки поиска. Не простой выбор * из ... –

+0

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

1

Предположим, вы используете mysql.

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

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

SELECT * FROM hotel WHERE hotel_name LIKE "%foobar%"; 
SELECT * FROM hotel_food_item WHERE item_name LIKE "%foobar%"; 
SELECT * FROM hotel_location WHERE hotel_name LIKE "%foobar%" OR street_name LIKE "%foobar%" OR city LIKE "%foobar%"; 
  • Убедитесь, что условие поиска защищены от SQL инъекций
  • Вы можете (или нет) хотят группа запрос в 1 больше запросов

Если база данных становится большим (как < 100 000 строк на столе), или если у вас есть много или поисковый запрос, вы можете быть заинтересованы в создании индекса поиска , или используйте выделенную базу данных предназначены для поиска текста, например, для поиска эластичности или чего-то еще.

Edit: Если актуальность вопрос, используйте MATCH AGAINST:

Вы должны создать 3 подзапросов, которые делают MATCH AGAINST, и они скомпилируют их вместе. Вы можете сделать AGAINST("foobar") as rank, чтобы у вас был счет, который вам нужен.

Это должно выглядеть следующим образом:

SELECT * 
FROM 
(
SELECT id, 'hotel' as table_name, MATCH (search_field1) AGAINST ("lorem") as rank FROM tableA 
UNION 
SELECT id, 'food' as table_name, MATCH (search_field2) AGAINST ("lorem") as rank FROM tableB 
) as res 

ORDER BY res.rank DESC 
+0

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

+1

Вы имеете в виду под «релевантностью»? – FMaz008

+0

@Prakash Raman Отредактированный ответ для подробностей об актуальности поиска. – FMaz008

1

, если вы не используете InnoDB таблицы, а вместо этого используют MyISAM, вы можете использовать MySQL, построенный в полнотекстового поиска.

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

SELECT *, MATCH(column_to_search) AGAINST($search_string) AS relevance 
FROM your_table 
WHERE MATCH(keywords) AGAINST($search_string IN BOOLEAN MODE) 
ORDER BY relevance 
LIMIT 20 
+0

не такой продвинутый, как предложенный lucene, но более простой в реализации и от того, что я испытал, работает достаточно хорошо. – dqhendricks

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