Я создаю сайт, который позволяет пользователям отправлять кавычки. Как я могу создать (относительно простой?) Поиск, который возвращает наиболее релевантные кавычки?
Например, если поисковый термин был «индейкой», я возвращаю кавычки, где слово «индейка» появляется дважды перед кавычками, где оно появляется только один раз.
(Я бы добавил несколько других правил, чтобы помочь отфильтровать нерелевантные результаты, но моя главная проблема в том, что.)
Все предлагают полнотекстовый поиск 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, скорее всего, приведет к изменению схемы базы данных.
Используйте Google Custom Site Search . Я слышал, что они кое-что знают о поиске.
Stackoverflow планирует использовать поисковую систему Lucene . Существует PHP-порт, написанный для Zend Framework, но может быть загружен как отдельный объект, не требующий всей навороты ZF. Это называется Zend_Search_Lucene, документация для которого вы можете найти здесь .
Ваш sql для этого будет выглядеть примерно так (где вы пытаетесь найти в нем цитаты с «индейкой»):
SELECT * FROM Quotes WHERE the_quote LIKE "%turkeyt%";
Оттуда вы можете понять, что делать с тем, что он выплескивает на вас.
Будьте осторожны, чтобы правильно обрабатывать случаи, когда злоумышленник может вводить вредоносный SQL в вашу базу данных, особенно если вы планируете разместить это на www. Если вы делаете это ради удовольствия, я думаю, это просто то, что вы хотите узнать.
Если вы новичок в базах данных и sql, я рекомендую sqlite над mysql. Гораздо проще настроить и работать, как ни в коем случае. Это вызовет потенциальные головные боли, связанные с необходимостью установки и настройки mysql в первый раз.
Я бы пошел с полнотекстовым поиском, посмотрите здесь: http://hockinson.com/fulltext-search-of-mysql-database-table.html
Если вы хотите написать свой собственный, взгляните на реализацию phpBB. Они имеют две таблицы, первый – это уникальный список всех слов, которые появляются в записях, а второй – многозначная ссылка между словами и записями. Затем вы можете сделать группу и подсчитать, чтобы отсортировать записи так, как вы ищите.
Это намного больше, чем реализация сторонней поисковой системы (или полнотекстового поиска), но это позволит вам более эффективно контролировать результаты.
В качестве альтернативы Sphinx и Lucene, относительно простая поисковая система может быть создана с использованием библиотеки Xapian .
+
Поддерживает множество расширенных функций поиска (например, рейтинг релевантности)
+
Быстрый
-
Вам нужно будет изучить API для создания вашего интерфейса
-
Требуется установить расширение php
Также обратите внимание, что Xapian сохраняет свои данные в отдельном индексе для mysql.
Вы также можете быть заинтересованы в Forage, который является оберткой для Solr, Xapian и Lucene.
Люди Xapian также создали поисковую систему Omega, которая является интерфейсом к Xapian и может быть вызвана через cgi.
Google Custom Site Search замечательный, если вы его не запрашиваете (я думаю, вы получите 1k запросов / день бесплатно) или если вы готовы платить.
Полнотекстовый поиск MySQL также является отличным ресурсом (как уже упоминалось ранее).
Yahoo BOSS – это интригующий проект – я собираюсь дать ему шанс во время моего следующего поискового проекта.
И, наконец, Lucene – отличный ресурс, если вам нужна больше энергии, чем полный текст, но вы хотите настроить собственную поисковую систему. http://lucene.apache.org
Я наткнулся на поисковую систему Zoom несколько дней назад и думаю, что это может быть самая простая поисковая система, которую я когда-либо использовал.
Инструмент на базе Windows создает базу данных сайта, затем он также спрашивает, какой язык (PHP, ASP.NET, JavaScript и т. Д.) Вы хотите использовать. Я выбрал PHP и создал для меня PHP-код. Все, что я должен был сделать, это загрузить файлы на сервер и (опционально) настроить шаблон, и поиск по сайту работал.
Это бесплатно для небольших сайтов, и единственное, что я могу найти, это то, что инструмент Spider (построитель базы данных) должен запускаться в Windows.