以编程方式实现软提交

时间:2018-05-30 06:43:53

标签: solr solrj solr5 autocommit

AutoSoftCommit和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。

2 个答案:

答案 0 :(得分:1)

您可以在创建集合时通过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);

另一种替代方法是通过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);

答案 1 :(得分:0)

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

<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 APIupdateHandler.autoCommit.*值(这对单个服务器也有效,但在这种情况下您必须为每个服务器调用配置API,因为设置不是自动分布在服务器上的)。

另一种替代方法是使用commitWithin代替,可以根据请求发送 - 允许您告诉Solr它可以在将内容提交到索引之前等待最多N毫秒。这通常是首选方法,因为它允许您在不执行显式提交的情况下从多个线程和服务器进行索引 - 这样您的提交就不会相互冲突。