1

我最近开始探索 SolrCloud 并尝试使用 CloudSolrServer 客户端索引文档。我看到的问题是,如果我不在 CloudSolrServer 对象上触发显式提交,则文档不会被索引。这是我的代码片段:

代码>
CloudSolrServer 服务器 = new CloudSolrServer("localhost:2181");
server.setDefaultCollection("collection1");
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "http://test.com/akn/test6.html");
doc.addField("Source2", "aknsource");
doc.addField("url", "http://test.com/akn/test6.html");
doc.addField("title", "SolrCloud 岩石");
doc.addField("text", "这是一个示例文本");
UpdateResponse resp = server.add(doc);
//UpdateResponse res = server.commit();

我有 2 个分片,每个分片有 1 个副本和一个 zookeeper 实例。

运行此测试代码后,我可以看到请求到达节点。这是日志的输出:


INFO  - 2013-09-26 03:19:04.981; 
org.apache.solr.update.processor.LogUpdateProcessor; [collection1] 
webapp=/solr path=/update params={distrib.from= 
http://ec2-1-2-3-4.us-west-1.compute.amazonaws.com:8983/solr/collection1/&update.distrib=TOLEADER&wt=javabin&version=2} 
{add=[http://test.com/akn/test6.html (1447223565945405440)]} 0 42 
INFO  - 2013-09-26 03:19:19.943; 
org.apache.solr.update.DirectUpdateHandler2; start 
commit{,optimize=false,openSearcher=false,waitSearcher=true,expungeDeletes=false,softCommit=false,prepareCommit=false} 
INFO  - 2013-09-26 03:19:20.249; org.apache.solr.core.SolrDeletionPolicy; 
SolrDeletionPolicy.onCommit: commits: num=2 

commit{dir=NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/mnt/ebs2/TestSolr44/solr/collection1/data/index 
lockFactory=org.apache.lucene.store.NativeFSLockFactory@36ddc581; 
maxCacheMB=48.0 maxMergeSizeMB=4.0),segFN=segments_7,generation=7} 

commit{dir=NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/mnt/ebs2/Testolr44/solr/collection1/data/index 
lockFactory=org.apache.lucene.store.NativeFSLockFactory@36ddc581; 
maxCacheMB=48.0 maxMergeSizeMB=4.0),segFN=segments_8,generation=8} 
INFO  - 2013-09-26 03:19:20.250; org.apache.solr.core.SolrDeletionPolicy; 
newest commit generation = 8 
INFO  - 2013-09-26 03:19:20.252; org.apache.solr.search.SolrIndexSearcher; 
Opening Searcher@c324b85 realtime 
INFO  - 2013-09-26 03:19:20.254; 
org.apache.solr.update.DirectUpdateHandler2; end_commit_flush 

从日志来看,提交似乎已成功完成。但是,如果我查询服务器,则没有任何条目出现。

现在,如果我打开


UpdateResponse res = server.commit(); 

我会查看索引的数据。这是日志:


INFO  - 2013-09-26 03:41:24.433; 
org.apache.solr.update.processor.LogUpdateProcessor; [collection1] 
webapp=/solr path=/update params={wt=javabin&version=2} {add=[ 
http://test.com/akn/test6.html (1447224970494083072)]} 0 12 
INFO  - 2013-09-26 03:41:24.490; 
org.apache.solr.update.DirectUpdateHandler2; start 
commit{,optimize=false,openSearcher=true,waitSearcher=true,expungeDeletes=false,softCommit=false,prepareCommit=false} 
INFO  - 2013-09-26 03:41:24.788; org.apache.solr.core.SolrDeletionPolicy; 
SolrDeletionPolicy.onCommit: commits: num=2 

commit{dir=NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/mnt/ebs2/TestSolr44/solr/collection1/data/index lockFactory=org.apache.lucene.store.NativeFSLockFactory@36ddc581; maxCacheMB=48.0 maxMergeSizeMB=4.0),segFN=segments_8,generation=8}

commit{dir=NRTCachingDirectory(org.apache.lucene.store.MMapDirectory@/mnt/ebs2/TestSolr44/solr/collection1/data/index lockFactory=org.apache.lucene.store.NativeFSLockFactory@36ddc581; maxCacheMB=48.0 maxMergeSizeMB=4.0),segFN=segments_9,generation=9} INFO - 2013-09-26 03:41:24.788; org.apache.solr.core.SolrDeletionPolicy; newest commit generation = 9 INFO - 2013-09-26 03:41:24.792; org.apache.solr.search.SolrIndexSearcher; Opening Searcher@138ba593 main INFO - 2013-09-26 03:41:24.794; org.apache.solr.update.DirectUpdateHandler2; end_commit_flush INFO - 2013-09-26 03:41:24.794; org.apache.solr.core.QuerySenderListener; QuerySenderListener sending requests to Searcher@138ba593main{StandardDirectoryReader(segments_9:21:nrt _0(4.4):C1 _1(4.4):C1 _3(4.4):C1 _4(4.4):C1 _5(4.4):C1 _7(4.4):C1)} INFO - 2013-09-26 03:41:24.795; org.apache.solr.core.QuerySenderListener; QuerySenderListener done. INFO - 2013-09-26 03:41:24.798; org.apache.solr.core.SolrCore; [collection1] Registered new searcher Searcher@138ba593main{StandardDirectoryReader(segments_9:21:nrt _0(4.4):C1 _1(4.4):C1 _3(4.4):C1 _4(4.4):C1 _5(4.4):C1 _7(4.4):C1)} INFO - 2013-09-26 03:41:24.798; org.apache.solr.update.processor.LogUpdateProcessor; [collection1] webapp=/solr path=/update params={waitSearcher=true&commit=true&wt=javabin&expungeDeletes=false&commit_end_point=true&version=2&softCommit=false} {commit=} 0 308

这是提交配置:

<autoCommit> 
<maxTime>30000</maxTime> 
<openSearcher>false</openSearcher> 
</autoCommit> 

<autoSoftCommit> <maxTime>1000</maxTime> </autoSoftCommit>

不知道我在这里缺少什么,任何指针都会被应用。

谢谢

4

3 回答 3

0

您需要在 solrconfig.xml 文件中配置自动软提交和硬提交参数。您可以做的另一件事是尝试通过 CloudSolrServer 使用 commitWithin,因为它比硬提交更灵活、更高效。您需要将硬提交间隔设置为 4-5 分钟(作为您的要求的套件)。有关更多详细信息,请参见下面的链接

http://wiki.apache.org/solr/CommitWithin

于 2013-10-28T07:09:39.307 回答
0

CloudSolrServer使用LoadBalanced HttpSolrServer,文档明确表示不要使用它来发出“写入”命令:

不要在主/从场景中使用此类进行索引,因为文档必须发送到正确的主服务器;没有完成节点间路由。

为什么不创建一个常规的 HttpSolrServer 指向 ZooKeeper(或包含 ZooKeeper 的分片)并使用它来插入文档(ZooKeeper/master 副本应该负责将它们发送到其他分片)?

于 2013-10-08T08:17:30.030 回答
0

在您包含的第一个日志中,它仅显示 openSearcher=false 的提交。这可确保数据被正确刷新,但不会使其可搜索。这可能是由于您的配置的 autoCommit 部分而发生的。

您粘贴的配置片段显示 autoSoftCommit 也存在,maxTime 为一秒,但日志未显示任何软提交。如果没有看到整个配置,就不可能说它是否真的有效。它可能被注释掉了。

于 2013-09-26T20:26:46.797 回答