Solr 学习笔记(五)-Solr扩展之分布式索引实例
准备:
????? 当你的所有数据非常多,一台服务器无法承担,这时Sharding是一种常见的扩展解决策略,即将这些索引数据分散到不同的服务器上,而查询时Solr具备将单一的查询请求分发到多个Solr shards上,并聚集结果到一个单一的result里返回调用者。
建立分布式索引需遵循以下条件:
?????? 索引的文档必须有一个唯一键; 当拥有相同的id的文档被查询到时,solr将选择第一个文档。其他的结果将被丢弃;在处理的过程中,也即是 stage过程中,索引是有可能发生变化的。这样在索引更新的时刻,可能会发现搜索的结果跟索引不匹配的现象。
实例描述:
操作系统:WindowsXP
Web容器:Tomcat
同时启动三个Tomcat模拟三台服务器,分配端口号分别为:8080,8888,8983
Solr配置:
注意:分布式索引不需要额外配置,已经被绑定在原有的Request Handlers上,
开始:
Step one: 向8888端口号服务器添加索引数据,原始数据见附件索引中kobe.xml
kobe.xml明细:
?
?
?
测试2: http://localhost:8983/solr/select/?q=id:112测试结果
?
?
?
测试3: http://localhost:8080/solr/select/?shards=localhost:8888/solr,localhost:8983/solr&q=singer测试结果:
?
?
?
测试4: http://localhost:8080/solr/select/?shards=localhost:8888/solr,localhost:8983/solr&q=player?测试结果
?
?
?Step four :分析?
测试1和测试2返回的结果都是从本机上索引文件获得的,而测试3和测试4是分布式查询,它所对应主机为8080,该服务武器上没有数据,这就是分布式查询(向8888和8983),将所有结果从不同Tomcat上聚合后返回
?
也可以根据前面学习笔记(三)中提供的SolrjClient来测试分布式索引。下面在三的基础上,开启三个Tomcat,模拟三台服务器,端口布置如上所示,开启三台服务器后,利用SolrjClient提供的接口分别向三台服务器提供索引数据如下:
向8080服务器:
?
?
向8888服务器添加:
?
?
向8983服务器添加:
??
然后在利用SolrjClient提供接口进行查询验证(在8080服务器上查询):
?
30id=0 msg=kobe bryant0 name=kylin soong0 id=1 msg=kobe bryant1 name=kylin soong1 id=2 msg=kobe bryant2 name=kylin soong2 id=3 msg=kobe bryant3 name=kylin soong3 id=4 msg=kobe bryant4 name=kylin soong4 id=5 msg=kobe bryant5 name=kylin soong5 id=6 msg=kobe bryant6 name=kylin soong6 id=7 msg=kobe bryant7 name=kylin soong7 id=8 msg=kobe bryant8 name=kylin soong8 id=9 msg=kobe bryant9 name=kylin soong9 id=10 msg=kobe bryant10 name=kylin soong10 id=11 msg=kobe bryant11 name=kylin soong11 id=12 msg=kobe bryant12 name=kylin soong12 id=13 msg=kobe bryant13 name=kylin soong13 id=14 msg=kobe bryant14 name=kylin soong14 id=15 msg=kobe bryant15 name=kylin soong15 id=16 msg=kobe bryant16 name=kylin soong16 id=17 msg=kobe bryant17 name=kylin soong17 id=18 msg=kobe bryant18 name=kylin soong18 id=19 msg=kobe bryant19 name=kylin soong19 id=20 msg=kobe bryant20 name=kylin soong20 id=21 msg=kobe bryant21 name=kylin soong21 id=22 msg=kobe bryant22 name=kylin soong22 id=23 msg=kobe bryant23 name=kylin soong23 id=24 msg=kobe bryant24 name=kylin soong24 id=25 msg=kobe bryant25 name=kylin soong25 id=26 msg=kobe bryant26 name=kylin soong26 id=27 msg=kobe bryant27 name=kylin soong27 id=28 msg=kobe bryant28 name=kylin soong28 id=29 msg=kobe bryant29 name=kylin soong29??
如上结果把符合查询字符串“Kobe”的所有字符串都返回,
?
PS:上述相关代码见学习笔记(三)附件
?????? 附件上XML文件与本文示例有些许差别……
?
结束
?
?
?
?
?
?
?
?
?
?
?
?