У меня есть коллекция Solr, имеющая 6 сегментов по годам — с 2019 по 2024 год. Я использую этот метод для удаления некоторых документов в этой коллекции:
invoke(() -> solrClient().deleteById(collectionName, ids ));
но на самом деле это не удаляет документы для соответствующих идентификаторов даже после ожидания в течение дня. Однако этот метод ниже работает и мгновенно удаляет документы.
invoke(() -> solrClient().deleteById(collectionName, ids, 1000 ));
try {
solrClient().commit(collectionName);
} catch (SolrServerException e) {
throw new RuntimeException(e);
} catch (IOException e) {
throw new RuntimeException(e);
}
Может кто-нибудь объяснить мне, что здесь происходит и какое значение имеет значение commitWithinMs, которое я использую здесь как 1000. Я не уверен, следует ли сохранить это значение равным 1000 мс или увеличить его.
Я использую Solr версии 8.9.
Я попытался передать значение параметра commitWithinMs как 1000 в методе deleteById и одновременно выполнил фиксацию, и это сработало, но я думал, что Solr выполняет автофиксацию, и я вижу время автофиксации, переданное в SolrConfig.xml
<autoCommit>
<!-- in ms, our setting is 10 min -->
<maxTime>600000</maxTime>
<maxDocs>100000</maxDocs>
<openSearcher>false</openSearcher>
</autoCommit>
Кроме того, просто передать commitWithinMs недостаточно, мне нужно сделать фиксацию сразу после вызова метода deleteByID.




В Apache Solr процесс добавления, обновления или удаления документов включает два основных этапа: отправку изменений в Solr и последующее отображение этих изменений путем их фиксации. Операция фиксации — это то, что фактически сохраняет изменения на диске и делает их доступными для поиска. Однако фиксация — дорогостоящая операция с точки зрения ввода-вывода, и слишком частое ее выполнение может отрицательно повлиять на производительность Solr. Именно здесь в игру вступают концепции commitWithinMs и автоматической фиксации, и их понимание может помочь вам обеспечить баланс между видимостью данных и производительностью системы.
commitWithinMsПараметр commitWithinMs указывает, что изменения (в вашем случае удаления) должны быть зафиксированы в индексе в течение заданного количества миллисекунд. Когда вы звоните deleteById(collectionName, ids, 1000), вы, по сути, запрашиваете, чтобы Solr зафиксировал эти удаления в течение 1000 миллисекунд (1 секунды) с момента их получения. Это способ предложить Solr попытаться сделать изменения видимыми в ближайшее время, но без принудительной немедленной фиксации.
Однако важно отметить, что commitWithinMs — это предложение для Solr, а не строгая гарантия. Фактическая фиксация может произойти немного позже указанного времени, в зависимости от загрузки сервера и настроек в solrconfig.xml.
Функция автоматической фиксации Solr предназначена для автоматической фиксации изменений после выполнения определенных условий, например, определенного интервала времени (maxTime) или определенного количества изменений (maxDocs). В вашем solrconfig.xml автоматическая фиксация настроена на срабатывание каждые 10 минут (600000 миллисекунд) или после изменения 100 000 документов. Эта функция гарантирует, что изменения станут видимыми своевременно, без необходимости фиксации вручную, что может повысить производительность за счет объединения нескольких изменений в одну операцию фиксации.
Даже если commitWithinMs и настроена автоматическая фиксация, существуют сценарии, в которых вам может потребоваться явно зафиксировать изменения. Например, если вам нужно, чтобы некоторые изменения были доступны для немедленного поиска, ожидание следующего цикла автоматической фиксации может оказаться неприемлемым. Вероятно, поэтому ваши удаления эффективны только тогда, когда вы явно вызываете commit после использования deleteById с commitWithinMs.
Явное подтверждение после удаления гарантирует, что изменения станут видимыми немедленно, но его следует использовать разумно, чтобы избежать проблем с производительностью.
Используйте commitWithinMs разумно: хотя указание значения commitWithinMs может помочь обеспечить своевременное выполнение удалений, полагаться исключительно на это без понимания последствий для производительности может быть проблематично. Это полезный параметр для операций, в которых у вас есть гибкость в выборе того, когда именно изменения станут видимыми, но вы хотите предложить временные рамки.
Поймите требования вашего приложения. Если немедленная видимость изменений имеет решающее значение для вашего приложения, то после удаления необходимо явное подтверждение, которое, как вы убедились, работает. Однако если ваше приложение допускает небольшую задержку, использование автоматической фиксации может повысить общую производительность.
Настройка параметров автоматической фиксации. Учитывайте конкретные потребности вашего приложения и соответствующим образом настройте параметры автоматической фиксации в solrconfig.xml. Если у вас большой объем обновлений и обновления происходят часто, возможно, вам захочется настроить параметры maxTime и maxDocs, чтобы обеспечить хороший баланс между видимостью изменений и производительностью.
Мониторинг производительности. Обратите внимание на то, как эти настройки влияют на производительность вашего кластера Solr. Настройка этих параметров может потребовать некоторых проб и ошибок, чтобы найти оптимальный баланс для вашего конкретного случая использования.
В заключение, использование commitWithinMs и явных коммитов должно быть адаптировано к потребностям вашего приложения, учитывая компромисс между немедленной видимостью данных и влиянием на производительность частых коммитов.
Это просто ответ, полученный LLM.
В первом примере вы просто отправляете свой запрос. Изменения не становятся постоянными, пока не произойдет фиксация; они будут просто находиться в памяти и никогда не сохраняться на диске. Если сервер перезапустится до того, как вы выполните фиксацию, изменения будут потеряны. Он не изменит то, что возвращается в результате поиска, пока не будет выпущена фиксация (и не будет открыт новый поисковик, что становится важным в дальнейшем).
В двух других примерах вы выполняете фиксацию, поэтому ваши изменения становятся видимыми. Вы делаете это двумя разными способами: один с commitWithin и другой с явным коммитом.
commitWithin сообщает Solr автоматически выполнить коммит, если ни один не был выполнен в течение заданного времени — это полезно при использовании нескольких клиентов для параллельной индексации контента, поэтому вы не выполняете коммиты от каждого клиента после каждого документа, но все равно хотите, чтобы обновления были быть видимым в течение определенного периода времени. то есть это особенно полезно в загруженных условиях, когда в течение короткого периода времени выполняется несколько обновлений. Если вы выполняете обновления только с низкой частотой, вы можете просто выполнить фиксацию для каждого обновления, поскольку не будет никакого снижения производительности, если фиксация все равно произошла бы в течение секунды (а других обновлений нет). в этот период времени).
И последняя проблема при использовании autoCommit сводится к следующему:
У вас openSearcher установлено значение false, поэтому ваши автокоммиты не приводят к открытию нового поискового запроса. Это означает, что поисковик (модуль, отвечающий за фактический поиск ваших документов в индексе на основе вашего запроса) по-прежнему остается старым и использует старый индекс; он никогда не переходит на измененный индекс после вашей фиксации.
Из справочного руководства:
Если это значение ложно, фиксация сбросит последние изменения индекса в стабильное хранилище, но не приведет к открытию нового средства поиска, чтобы сделать эти изменения видимыми.
Таким образом, изменения сохранятся в течение десяти минут, но не будут видны, пока не будет открыт новый поисковик. Это может произойти из-за явной фиксации где-то еще, оптимизации или перезапуска сервера Solr.
Привет Спасибо за ответ! Я до сих пор этого не понимаю: если указать значение commitWithinMs как 1 секунду и не выполнять явные фиксации, почему изменения не видны из-за автоматических фиксаций, происходящих каждые 10 минут, которые настроены. А что именно произойдет, если я укажу commitWithinMs как 1 секунду, но не выполню явную фиксацию? Ожидает ли solr выполнения AutoCommit или отбрасывает эти изменения (в данном случае удаления). Спасибо!