Как мне реализовать простой поиск по сайту с помощью php и mySQL? - PullRequest
15 голосов
/ 22 декабря 2008

Я создаю сайт, который позволяет пользователям отправлять цитаты. Как мне создать (относительно простой?) Поиск, который возвращает наиболее релевантные кавычки?

Например, если поисковым термином было «индейка», я бы возвращал кавычки, где слово «индейка» встречается дважды перед кавычками, где оно встречается только один раз.

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

Ответы [ 9 ]

34 голосов
/ 22 декабря 2008

Все предлагают полнотекстовый поиск MySQL, однако вы должны знать ОГРОМНОЕ предостережение. Механизм полнотекстового поиска доступен только для механизма MyISAM (не InnoDB, который наиболее часто используется из-за своей ссылочной целостности и соответствия ACID).

Итак, у вас есть несколько вариантов:

1. Простейший подход обозначен Particle Tree . На самом деле вы можете получить ранжированный поиск из чистого SQL (без полного текста, без ничего). Приведенный ниже SQL-запрос будет искать таблицу и ранжировать результаты по количеству появлений строки в полях поиска:

SELECT
    SUM(((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'term', '')))/4) +
        ((LENGTH(p.body) - LENGTH(REPLACE(p.body, 'search', '')))/6))
    AS Occurrences
FROM
    posts AS p
GROUP BY
    p.id
ORDER BY
    Occurrences DESC

отредактировал их пример для большей ясности

Варианты вышеупомянутого SQL-запроса, добавление операторов WHERE (WHERE p.body LIKE "% независимо от%%, который вы хотите") и т. Д., Вероятно, получат именно то, что вам нужно.

2. Вы можете изменить схему базы данных для поддержки полного текста. Часто для сохранения ссылочной целостности InnoDB, соответствия ACID и скорости без необходимости установки плагинов, таких как Sphinx Fulltext Search Engine для MySQL, необходимо разделить данные кавычек в свою собственную таблицу. По сути, у вас будет таблица Quotes, представляющая собой таблицу InnoDB, которая вместо вашего поля TEXT «data» содержит ссылку «quote_data_id», которая указывает на идентификатор таблицы Quote_Data, которая является таблицей MyISAM. Вы можете сделать свой полный текст в таблице MyISAM, объединить идентификаторы, возвращенные с вашими таблицами InnoDB, и вуаля, у вас есть результаты.

3. Установка Сфинкс . Удачи с этим.

Учитывая то, что вы описали, я HIGHLY рекомендую вам использовать 1-й подход, который я представил, так как у вас простой сайт, управляемый базой данных. 1-е решение простое, быстро выполняет работу. Lucene будет достаточно сложным для настройки, особенно если вы хотите интегрировать его с базой данных, так как Lucene предназначен главным образом для индексирования файлов, а не баз данных. Пользовательский поиск Google просто лишает ваш сайт тонны репутации (заставляет вас выглядеть дилетантским и взломанным), а полный текст MySQL, скорее всего, заставит вас изменить схему базы данных.

5 голосов
/ 22 декабря 2008

Использовать Google Custom Site Search . Я слышал, они знают кое-что о поиске.

3 голосов
/ 22 декабря 2008

Stackoverflow планирует использовать поисковую систему Lucene . Это порт PHP написан для Zend Framework, но может быть загружен как отдельная сущность без необходимости использования всего ZF. Это называется Zend_Search_Lucene, документация для которой можно найти здесь

2 голосов
/ 22 декабря 2008

Ваш sql для этого будет выглядеть примерно так (где вы пытаетесь найти цитаты с «индейкой» в нем):

SELECT * FROM Quotes
WHERE the_quote LIKE "%turkeyt%";

Оттуда вы можете понять, что делать с тем, что вам выплевывает.

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

Если вы новичок в базах данных и sql, я рекомендую sqlite over mysql. Гораздо проще настроить и работать с ним, как без настройки. Это избавит вас от потенциальных проблем, связанных с первой установкой и настройкой mysql.

1 голос
/ 23 декабря 2008

В качестве альтернативы Sphinx и Lucene можно создать относительно простую поисковую систему с использованием библиотеки Xapian .

+ Поддерживает множество функций расширенного поиска (например, рейтинг релевантности)
+ Быстро

- Вам потребуется изучить API для создания вашего интерфейса
- Требуется расширение php для установки

Обратите внимание, что Xapian хранит свои данные в отдельном индексе для mysql.

Вас также может заинтересовать Фураж , который является оберткой для Solr, Xapian и Lucene.

Люди Xapian также создали поисковую систему Omega, которая является интерфейсом Xapian и может вызываться через cgi.

1 голос
/ 22 декабря 2008

Если вы хотите написать свое собственное, посмотрите на реализацию phpBB. У них есть две таблицы, первая представляет собой уникальный список всех слов, которые появляются в записях, а вторая представляет собой ссылку «многие ко многим» между словами и записями. Затем вы можете составить группу и сосчитать, чтобы отсортировать записи так, как вы ищете.

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

1 голос
/ 22 декабря 2008

Я бы пошел с полнотекстовым поиском, посмотрите здесь: http://hockinson.com/fulltext-search-of-mysql-database-table.html

0 голосов
/ 07 декабря 2009

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

Средство на основе Windows создает базу данных сайта, а затем спрашивает, какой язык (PHP, ASP.NET, JavaScript и т. Д.) Вы хотите использовать. Я выбрал PHP, и он создал код PHP для меня. Все, что мне нужно было сделать, это загрузить файлы на сервер и (необязательно) настроить шаблон, и поиск по сайту работал.

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

0 голосов
/ 22 декабря 2008

Google Custom Site Search - это замечательно, если вы не очень много запрашиваете (я думаю, вы получаете 1 000 запросов в день бесплатно) или если вы готовы платить.

Полнотекстовый поиск MySQL также является отличным ресурсом (как уже упоминалось ранее).

Yahoo BOSS - интригующий проект - я собираюсь дать ему шанс во время моего следующего поискового проекта.

И, наконец, Lucene - отличный ресурс, если вам нужно больше мощности, чем полнотекстового, но вы хотите настроить свою поисковую систему. http://lucene.apache.org

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