Как реализовать простой поиск по сайту с php и mySQL?

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

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

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

Ответы

Ответ 1

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

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

1. Самый простой подход описывается Деревом частиц. Вы можете actaully получать ранжированные поиски от чистого 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 '% what% you% want) и т.д., вероятно, доставят вам именно то, что вам нужно.

2. Вы можете изменить схему базы данных для поддержки полного текста. Часто то, что делается для поддержания ссылочной целостности InnoDB, соответствия ACID и скорости без необходимости установки плагинов, таких как Sphinx Fulltext Search Engine для MySQL - это разделение данные котировки в его собственную таблицу. В основном у вас будет таблица "Котировки", которая представляет собой таблицу InnoDB, которая вместо того, чтобы иметь поле данных "ТЕКСТ", имеет ссылку "quote_data_id", которая указывает на идентификатор в таблице Quote_Data, которая является таблицей MyISAM. Вы можете сделать полный текст в таблице MyISAM, присоединиться к идентификаторам, возвращенным с помощью таблиц InnoDB, и получить ваши результаты.

3. Установите Sphinx. Удачи вам в этом.

Учитывая то, что вы описали, я бы ВЫСОКО рекомендовал вам принять первый подход, который я представил, поскольку у вас есть простой сайт с базой данных. Первое решение прост, быстро выполняется работа. Lucene будет сукой для настройки, особенно если вы хотите интегрировать ее с базой данных, поскольку Lucene предназначена главным образом для индексирования файлов, а не баз данных. Пользовательский поиск по сайту Google просто заставляет ваш сайт потерять массу репутации (заставляет вас выглядеть любительским и взломанным), а MySQL fulltext, скорее всего, приведет к изменению схемы базы данных.

Ответ 2

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

Ответ 4

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

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

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

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

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

Ответ 6

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

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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

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

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

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

Ответ 9

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

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

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