以编程方式实现软提交

Achieve soft-commit programmatically

A​​utoSoftCommit 和 autoCommit 配置在 solrConfig.xml。

我可以使用 Java 在我的应用程序级别配置这些设置吗?

我想知道的是,我可以使用 SolrJ 库配置 autoSoftCommit 和 autoCommit 吗?

我问这个问题的原因是,应用程序是一个 springBoot 应用程序,API 和 solr 都捆绑在同一个构建中。并且相同的构建用作主(索引器)和从属(使用 http 调用通过索引复制进行复制 -

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

如果我修改solrconfig.xml,它会同时改变master和slave。

您可以将不同的文件复制到您的客户端 - 它不必与主节点的配置文件相同。

<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 在从服务器上,让您可以完全控制主服务器和从服务器的设置。

如果您 运行 处于云模式(看起来您不是,因为您在谈论显式复制),可以使用以下命令为集群上的整个集合设置自动提交值Config APIupdateHandler.autoCommit.* 值(这对单个服务器也有效,但在这种情况下您必须为每个服务器调用配置 API,因为设置没有分布在自动服务器)。

另一种选择是使用 commitWithin,它可以按请求发送 - 允许您告诉 Solr 它最多可以等待 N 毫秒,然后再将内容提交到索引。这通常是首选方式,因为它允许您从多个线程和服务器进行索引而无需进行显式提交 - 这样您的提交就不会相互冲突。

您可以在创建集合时通过Java代码添加autoCommit 和autoSoftCommit。请参考下面的代码。 初始化值如"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);

另一种选择是通过配置 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);