java - выступления MongoDB + Solr - PullRequest
       10

java - выступления MongoDB + Solr

25 голосов
/ 25 августа 2011

Я много осматривался, чтобы понять, как использовать MongoDB в сочетании с Solr, и некоторые вопросы здесь имеют частичные ответы, но ничего конкретного (больше как теории).В моем приложении у меня будет много-много документов, хранящихся в MongoDB (может быть, до нескольких сотен миллионов), и я хочу реализовать полнотекстовый поиск по некоторым свойствам этих документов, поэтому я полагаю, что Solr - лучший способ сделать это.this.

То, что я хочу знать, - это как мне все настроить / выполнить так, чтобы он имел хорошие характеристики?прямо сейчас, вот что я делаю (и я знаю, что это не оптимально):

1- При вставке объекта в MongoDB я затем добавляю его в Solr

SolrServer server = getServer();
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
server.add(document);
server.commit();

2- При обновлениисвойство объекта, так как Solr не может обновить только одно поле, сначала я получаю объект из MongoDB, затем я обновляю индекс Solr всеми свойствами из объекта и новыми и делаю что-то вроде

StreamingUpdateSolrServer update = new StreamingUpdateSolrServer(url, 1, 0);
SolrInputDocument document = new SolrInputDocument();
document.addField("id", documentId);
...
update.add(document);
update.commit();

3-При запросе сначала я запрашиваю Solr, а затем при получении списка документов SolrDocumentList просматриваю каждый документ и:

  1. получаю идентификатор документа
  2. получаю объект изMongoDB имеет тот же идентификатор, чтобы иметь возможность извлекать свойства оттуда

4- При удалении, ну, я еще не выполнил эту часть и не совсем уверен, как это сделать в Java

Итак, у кого-нибудь есть предложения о том, как сделать это более эффективным способом для каждого из описанных здесь сценариев?как процесс, который делает это так, что для перестроения индекса не понадобится 1 час при наличии большого количества документов в Solr и добавлении одного документа за раз?Мои требования заключаются в том, чтобы пользователи могли добавлять один документ за раз, много раз, и я бы хотел, чтобы они могли получить его сразу после

Ответы [ 2 ]

14 голосов
/ 31 августа 2011

Ваш подход действительно хорош. Некоторые популярные фреймворки, такие как Compass, выполняют то, что вы описываете на более низком уровне, чтобы автоматически отражать изменения индекса, которые были выполнены с помощью фреймворка ORM (см. http://www.compass -project.org / Overview.html ).

В дополнение к тому, что вы описываете, я бы также регулярно переиндексировал все данные, которые хранятся в MongoDB, чтобы обеспечить синхронизацию Solr и Mongo (вероятно, не так долго, как вы думаете, в зависимости от числа). документа, количество полей, количество токенов на поле и производительность анализаторов: я часто создаю индекс от 5 до 8 миллионов документов (около 20 полей, но текстовые поля короткие) менее чем за 15 минут с помощью сложных анализаторов , просто убедитесь, что ваш RAM-буфер не слишком мал и не выполняйте фиксацию / оптимизацию, пока все документы не будут добавлены).

Что касается производительности, фиксация затратная, а оптимизация - очень затратная. В зависимости от того, что для вас важнее всего, вы можете изменить значение mergefactor в Solrconfig.xml (высокие значения улучшают производительность записи, тогда как низкие значения улучшают производительность чтения, 10 - это хорошее значение для начала).

Кажется, вы боитесь времени создания индекса. Однако, поскольку хранилище индексов Lucene основано на сегментах, пропускная способность записи не должна сильно зависеть от размера индекса (http://lucene.apache.org/java/2_3_2/fileformats.html). Однако время прогрева увеличится, поэтому вы должны убедиться, что

  • есть типичные (особенно для сортировки для загрузки кэшей полей), но не слишком сложные запросы в параметрах firstSearcher и newSearcher в вашем файле конфигурации solrconfig.xml,
  • useColdSearcher установлен в
    • false, чтобы иметь хорошую производительность поиска, или
    • true, если вы хотите, чтобы изменения, внесенные в индекс, учитывались быстрее за счет более медленного поиска.

Более того, если для вас приемлемо, если данные становятся доступными для поиска только через несколько X миллисекунд после их записи в MongoDB, вы можете использовать функцию commitWithin в UpdateHandler. Таким образом, Solr придется совершать реже.

Для получения дополнительной информации о факторах производительности Solr см. http://wiki.apache.org/solr/SolrPerformanceFactors

Чтобы удалить документы, вы можете удалить либо по идентификатору документа (как определено в schema.xml), либо по запросу: http://lucene.apache.org/solr/api/org/apache/solr/client/solrj/SolrServer.html

1 голос
/ 02 сентября 2011
  1. Вы также можете ждать больше документов и индексировать их только каждые X минут.(Конечно, это сильно зависит от вашего приложения и требований)

  2. Если ваши документы маленькие и вам не нужны все данные (которые хранятся в MongoDB), вы можете указать только полевам нужно в документе Solr хранить их, но не индексировать

<field name="nameoyourfield" type="stringOrAnyTypeYouuse" проиндексирован ="false" сохранен ="true"/>

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