以编程方式实现软提交
Achieve soft-commit programmatically
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。
您可以将不同的文件复制到您的客户端 - 它不必与主节点的配置文件相同。
<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 API 和 updateHandler.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);
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。
您可以将不同的文件复制到您的客户端 - 它不必与主节点的配置文件相同。
<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 API 和 updateHandler.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);