Достичь мягкой фиксации программно

AutoSoftCommit и autoCommit настраиваются в solrConfig.xml.

Могу ли я настроить эти параметры на уровне моего приложения с помощью Java?

Я хочу знать, могу ли я настроить autoSoftCommit и autoCommit с помощью библиотеки SolrJ?

Причина, по которой я задаю этот вопрос, заключается в том, что приложение представляет собой приложение SpringBoot с API и solr, объединенное в одну сборку. И одна и та же сборка используется в качестве главного (индексатора) и подчиненных (реплицируется через репликацию индекса с использованием http-вызова -

http://slave_machine/coreName/replication?masterUrl=http://master_machine/coreName&command=fetchindex)

Если я изменю solrconfig.xml, он будет изменен как для главного, так и для подчиненного устройства.


person Vibhav Singh Rohilla    schedule 30.05.2018    source источник


Ответы (2)


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

<requestHandler name="/replication" class="solr.ReplicationHandler" >
    <lst name="master">
      [....]
      <str name="confFiles">solrconfig-slave.xml:solrconfig.xml,schema.xml,stopwords.txt</str>
    </lst>
</requestHandler>

Это реплицирует файл solrconfig-slave.xml на ведущем устройстве как solrconfig.xml на ведомом, позволяя вам иметь полный контроль над настройками как для ведущего, так и для ведомых устройств.

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

Другой альтернативой является использование вместо этого commitWithin, которое может быть отправлено для каждого запроса, что позволяет вам сообщить Solr, что он может ждать до N миллисекунд, прежде чем зафиксировать содержимое в индексе. Обычно это предпочтительный способ, поскольку он позволяет вам индексировать несколько потоков и серверов без явных коммитов, чтобы ваши коммиты не конфликтовали друг с другом.

person MatsLindh    schedule 30.05.2018
comment
У меня будет одинаковая сборка для мастера и раба. Если я добавлю reuestHandler репликации, это будет работать как для главного, так и для подчиненного устройства. Плюс я хочу знать, возможны ли autoSoftCommits с использованием solrJ или нет. - person Vibhav Singh Rohilla; 30.05.2018
comment
autoSoftCommits не привязан к конкретному запросу. Это параметр того, как сервер должен вести себя при обработке запросов (поэтому вы можете установить его с помощью Config API, если это необходимо, как описано). Вы можете использовать один и тот же файл конфигурации как для запроса, так и для подчиненного устройства, а затем просто изменить значение, которое вам нужно изменить в файле xml, который реплицируется на подчиненное устройство. Чтобы иметь настройку для каждого запроса, commitWithin является правильной настройкой. - person MatsLindh; 30.05.2018

Вы можете добавить autoCommit и autoSoftCommit через код Java при создании коллекции. Пожалуйста, обратитесь к приведенному ниже коду для того же самого. Инициализируйте значение, например "collectionName", "solrZKConfigName", "numShards" и т. д.

String solrZkHostPort = "10.14.40.11:2181,10.14.40.11:2182,10.14.40.11:2183";
List<String> zk_Hosts = Arrays.asList(solrZkHostPort.split(","));
CloudSolrClient cloudSolrClient = new CloudSolrClient.Builder(zk_Hosts, Optional.empty()).build();
Map<String, String> collectionProperties = new HashMap<>();
collectionProperties.put("solr.autoCommit.maxTime", 10000);
collectionProperties.put("solr.autoSoftCommit.maxTime", 15000);
final CollectionAdminRequest.Create adminRequest = CollectionAdminRequest.Create
                .createCollection(collectionName, solrZKConfigName, numShards, numReplicas) .setMaxShardsPerNode(maxShardsPerNode).setProperties(collectionProperties);
CollectionAdminResponse adminResponse = adminRequest.process(cloudSolrClient);

Другой альтернативный вариант — через Config API.

Map<String, String> props= new HashMap<>();
props.put("solr.autoCommit.maxTime", 10000);
props.put("solr.autoSoftCommit.maxTime", 15000);

StringBuilder command = new StringBuilder("{\"set-property\": {");
   for (Map.Entry<String, String> entry: props.entrySet())
   {
      command.append('"').append(entry.getKey()).append('"').append(':');
      command.append(entry.getValue()).append(',');
   }
   command.setLength(command.length()-1); // remove last comma
   command.append("}}");

   GenericSolrRequest rq = new GenericSolrRequest(SolrRequest.METHOD.POST, "/config", null);
   ContentStream content = new ContentStreamBase.StringStream(command.toString());
   rq.setContentStreams(Collections.singleton(content));
   rq.process(solrClient);
person Abhijit Bashetti    schedule 01.07.2019