Как реализовать функцию поиска на веб-сайте?

Я хочу реализовать функцию поиска для веб-сайта (предположим, что он похож на SO). Я не хочу использовать Google для поиска таких вещей.

Мой вопрос:

Как это реализовать?

Есть два метода, о которых я знаю:

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

Может ли кто-нибудь сказать мне, куда идти? Каковы плюсы и минусы?

Лучше, есть ли лучшие способы сделать это?

Ответ 1

Использовать lucene,
http://lucene.apache.org/java/docs/

Apache Lucene - высокопроизводительная полнофункциональная текстовая поисковая библиотека, полностью написанная на Java. Это технология, подходящая практически для любого приложения, которое требует полнотекстового поиска, особенно кросс-платформенного.

Он доступен в java и .net. Он также доступен в php в виде модуля рамки zend.

Lucene делает то, что вам нужно (индексирование найденных элементов), вам нужно отслеживать индекс lucene, но это намного лучше, чем поиск в базе данных с точки зрения производительности. BTW, SO поиск работает на lucene.: D

Ответ 2

Это зависит от того, насколько полно ваш веб-сайт и сколько вы хотите сделать сами.

Если вы используете aa небольшой веб-сайт без дополнительных возможностей для добавления пользовательского поиска, разрешите google выполнять работу (возможно, добавьте sitemap) и используйте пользовательский поиск Google.

Если вы запустите средний сайт с помощью движка sql, используйте функции поиска вашего движка sql.

Если вы запустите некоторый более тяжелый программный стек, например J2EE или .Net, используйте Lucene, отличный, мощный поисковая система или ее .Net-клон lucene.Net

Если вы хотите абстрагировать свой поиск из своего приложения и иметь возможность запрашивать его на нейтральном языке с помощью XML/HTTP и JSON API, посмотрите solr. Solr запускает lucene в фоновом режиме, но добавляет к нему приятный веб-интерфейс.

Ответ 3

Возможно, вам стоит взглянуть на xapian и omega. Это, по сути, инструментарий, на котором вы можете создавать функции поиска.

Ответ 4

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

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

Недостаток, который у вас есть с подходом к индексированию, - это время поворота. Возможны обходные пути (например, материал Sitemap для Google), но они также сложны для правильного выбора.

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

Ответ 5

Если вы находитесь на платформе Microsoft, вы можете использовать службу индексирования. Это очень удобно с веб-сайтами IIS.

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

Сделайте Google, и вы найдете тонны!

Ответ 6

Это несколько ортогонально вашему вопросу, но я настоятельно рекомендую идею поиска RESTful. То есть для выполнения поиска, который никогда не выполнялся, веб-сайт отправляет запрос /search/. Чтобы повторно запустить поиск, веб-сайт GET/search/{some id}

В отношении этого есть несколько хороших документов, например здесь.

(Тем не менее, мне нравится индексирование, где это возможно, хотя это оптимизация и, следовательно, может быть преждевременным.)

Ответ 7

Если приложение использует стек Java EE, и вы используете Hibernate, вы можете использовать Compass Framework поддерживает индекс поиска вашей базы данных. Компас Framework использует Lucene под капотом.

Единственный улов в том, что вы не можете реплицировать свой индекс поиска. Поэтому вам нужно использовать кластерную базу данных для хранения индексных таблиц или использовать новые механизмы хранения индексов на основе сетки, которые были добавлены в Compass Framework 2.x.