Как реализовать алгоритм поиска - PullRequest
1 голос
/ 04 февраля 2012

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

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

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

Существуют ли какие-либо распространенные алгоритмы поиска или пакеты, которые можно использовать?

КОМПЛЕКТ ОЖИДАЕМЫХ РЕЗУЛЬТАТОВ:

id |имя |описание |имя_таблицы |ранг

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

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

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

....

Ответы [ 4 ]

2 голосов
/ 04 февраля 2012

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

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

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

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

1 голос
/ 04 февраля 2012

, если вы не используете таблицу 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
1 голос
/ 04 февраля 2012

Давайте рассмотрим, что вы используете 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 строк на таблицу) или если у вас много или поисковый запрос, вас может заинтересовать создание <strong>поискового индекса или использование выделенная база данных предназначенная для текстового поиска, например упругого поиска или чего-то еще.

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
1 голос
/ 04 февраля 2012

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

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

...