Параметры полнотекстового поиска для настройки MongoDB
Мы планируем хранить миллионы документов в MongoDB, и полнотекстовый поиск очень необходим. Я читал Elasticsearch и Solr - лучшие доступные решения для полнотекстового поиска.
-
Является ли Elastic search достаточно зрелым, чтобы его можно было использовать для полнотекстового поиска Mongodb? Мы также собираем коллекции. Работает ли Elasticsearch с коллекциями Sharded?
-
Каковы преимущества и недостатки использования Elasticsearch или Solr?
-
Может ли MongoDB выполнять полный текстовый поиск?
Ответы
Ответ 1
В MongoDB есть некоторые возможности поиска, но они не такие многофункциональные, как поисковые системы.
http://www.mongodb.org/display/DOCS/Full+Text+Search+in+Mongo
Мы используем Mongo с Solr, чтобы сделать контент доступным для поиска. Мы предпочитаем Solr, потому что
- Легко настроить и настроить
- У этого сообщества большое сообщество (это действительно полезно, если вы работаете с инструментами open source).
Поскольку мы не работали с ES, я не мог много говорить об этом. Вы можете найти некоторые обсуждения о Solr vs ES по ссылкам ниже.
Ответ 2
У меня есть опыт работы с Solr/MySQL и ElasticSearch/MongoDB.
Если вы собираетесь много раз запрашивать свою поисковую систему, вы уже оштрафовали свой MongoDB (я имею в виду, если вы хотите очертить слишком свою поисковую систему): вы должны использовать ElasticSearch, если только вы не хотите, чтобы сделано с помощью ElasticSearch. И вы должны использовать его, даже если вы не собираетесь обманывать.
ElasticSearch - это новый проект поверх Lucene, который привносит механизм окантовки от тех, кто используется для распределенных сред и поиска (Shay Bannon сделал Compass и работал в Gigaspaces, редакторе datagrid).
ElasticSearch так же просто, как MongoDB для осколков, я думаю, что он еще проще и по умолчанию отлично работает для большинства случаев.
Мне так не нравится Solr.
- langage запроса вообще не структурирован (но это касается плагинов и Lucene, и я думаю, вы можете использовать этот неструктурированный запрос langage с ES тоже)
- Я не думаю, что есть правильный клиент Solr. Клиент Solr java отстой, и я слышал, что ребята из PHP также жалуются, в то время как ElasticSearch Java-клиент очень приятный, гораздо более типичный и предлагает поддержку async (хорошо, если вы используете Netty для примера). С помощью Solr вы сделаете много конкатенации строк.
- Менее простота масштабирования
- Не так новый проект, я чувствовал, что у него есть технический отдел. ElasticSearch рождается из Compass, поэтому я думаю, что весь технический отдел был сброшен, чтобы иметь новый новый подход.
Что касается импорта данных, у меня есть опыт работы с реками Solr DataImportHandler и ElasticSearch (CouchDB и MongoDB). Я могу вам сказать:
- Solr позволяет делать больше вещей, но в очень неструктурированном XML-способе, и документация не поможет вам так много понять, что действительно происходит, когда вы вышли из мира привет и попытаетесь использовать некоторые дополнительные функции.
- Подход ElasticSearch более прост и также ограничен, но имеет встроенную поддержку некоторых технологий, в то время как DataImportHandler кажется более сложным - дружественным SQL
- В моем проекте Solr мне пришлось использовать ручную индексацию для некоторых документов, но это было главным образом из-за невозможности денормализовать необходимые данные в документе (проект Solr использует MySQL).
Существует также новый соединитель MongoDB для Solr и ElasticSearch, который мне нужно протестировать как можно скорее:)
http://blog.mongodb.org/post/29127828146/introducing-mongo-connector
Итак, в конце концов, я окончательно выберу ElasticSearch, потому что:
- Теперь у него отличное сообщество.
- Многие люди, которых я знаю с опытом работы с Solr, как ElasticSearch
- Клиентская сторона более безопасна и структурирована и обеспечивает асинхронную работу с Java Futures
- Оба могут, возможно, легко импортировать данные из MongoDB с помощью нового соединителя
- Насколько я знаю, он позволяет делать почти все, что делает Solr (по моему опыту, но я не специалист по поисковым системам).
- Он добавляет окантовку из коробки.
- Он добавляет перколяцию, которая может помочь в построении масштабируемых приложений реального времени (но вам, вероятно, потребуется дополнительная технология обмена сообщениями).
- Исходный код, который я прочитал, почти не имеет технического отдела по сравнению с Solr (по крайней мере, на стороне клиента), и кажется, что легко создавать плагины.
Ответ 3
В терминах MongoDB изначально, нет, у него нет поддержки полного текстового поиска. Вы можете видеть, что это популярный запрос функции:
https://jira.mongodb.org/browse/SERVER-380
Из того, что я знаю о плагине рек ES для MongoDB, он обрабатывает функцию oplog для ее функциональности. Так как у заштрихованной установки будет несколько залогов, и нет никакого способа легко изменить этот код для подключения через монго.
Аналогично для Solr, примеры, которые я видел, обычно связаны с аналогичным поведением с ES-плагином. Здесь еще более полная информация:
http://blog.knuthaugen.no/2010/04/cooking-with-mongodb-and-solr.html
У меня нет опыта использования одного, но другие уже делали сравнения, посмотрите здесь:
Solr vs. ElasticSearch
ElasticSearch, Sphinx, Lucene, Solr, Xapian. Что подходит для использования?
Ответ 4
MongoDB не может выполнять эффективный полнотекстовый поиск. Вы можете выполнять подстановочный поиск по полям, но я не думаю, что они эффективно используют индексы.
Я бы рекомендовал использовать речную функциональность ElasticSearch для автоматического перевода документов из MongoDB в ElasticSearch.
elasticsearch-river-mongodb - это MongoDB to Elasticsearch river, что при изменении документа в MongoDB ElasticSearch будет отслеживать oplog и затем автоматически обновлять свой индекс.
Это минимизирует проблему синхронизации двух хранилищ данных, поскольку ElasticSearch просто контролирует таблицы репликации Mongo.
Ответ 5
Монго не подходит для полнотекстового поиска.
Очевидно, вам нужно индексировать свои поля для быстрого поиска, а индексирование полей, содержащих BIG-данные (длинные длинные строки), не будет выполнено в монго. он имеет предел 1k для индекса, если у вас есть контент больше thn 1k, он будет проигнорирован индексом и не будет отображаться в результатах вашего поиска. очевидно, если вы пытаетесь выполнить полный текстовый поиск своих статей, монго не является хорошим выбором.
Ответ 6
В настоящее время в MongoDB 2.4.6 теперь есть полнотекстовый поиск в MongoDB, и он более функциональный, чем в предыдущих версиях. На http://docs.mongodb.org/manual/core/text-search/ описаны возможности новой функциональности.
Стоит упомянуть:
- обозначает и ставит поисковый запрос во время создания индекса и выполнения текстовой команды. присваивает оценку каждому документу, который
- содержит поисковый запрос в индексированных полях. Оценка определяет релевантность документа для заданного поискового запроса.
Однако в этом ответе (с сентября 2013 года) fooobar.com/questions/236098/... вы можете видеть, что монго все еще предупреждает об использовании этой функциональности в производстве. Эта функциональность все еще находится в стадии бета-тестирования.
Ответ 7
Полностью текстовый поиск становится возможным в среде продукта с Mongodb с версии 2.6, создавая текстовый индекс в обязательных полях.
индексный текст в mongodb