Достигайте программной фиксации программного - PullRequest
0 голосов
/ 30 мая 2018

AutoSoftCommit и autoCommit настроены на solrConfig.xml.

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

Что я хочу знать, Можно ли настроитьautoSoftCommit и autoCommit с использованием библиотеки SolrJ?

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

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

. Если я изменю solrconfig.xml, он будет изменен как для master, так и для slave.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Вы можете добавить 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);
0 голосов
/ 30 мая 2018

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

<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 миллисекунд, прежде чем передать содержимое в индекс.Обычно это предпочтительный способ, поскольку он позволяет индексировать из нескольких потоков и серверов без явных фиксаций, чтобы ваши коммиты не конфликтовали друг с другом.

...