Solr能否基于搜索字符串关联两张Cassandra表并实现类MSSQL JOIN功能?
Solr能否基于搜索字符串关联两张Cassandra表并实现类MSSQL JOIN功能?
当然可以实现!不过你之前的查询写法有问题,咱们一步步理清楚怎么操作~
首先,Solr支持跨core的Join查询,刚好能满足你关联两张Cassandra表(对应两个Solr core)的需求,核心是用!join查询解析器指定关联字段和目标core。
先说说你之前写法的问题
你之前的查询http://localhost:8983/solr/keyspace.solr_table1/select/?q{!join+fromIndex=keyspace.solr_table2}key:value缺少了关联字段的指定——Solr不知道要用哪个字段来匹配两张表的记录,而且搜索条件的位置也不对,这才导致查询失效。
正确的实现方式
假设你的两张Cassandra表对应的Solr core分别是keyspace.student_record和keyspace.student_personal,关联字段是s_id,且这个字段在两个core中都被正确索引(字段类型最好一致,比如都是字符串或整型),那可以这样写查询:
场景1:从student_record出发,关联student_personal并带搜索条件
比如要查询student_record中grade:10的学生,同时获取他们在student_personal里的个人信息:
http://localhost:8983/solr/keyspace.student_record/select?q=grade:10{!join from=s_id to=s_id fromIndex=keyspace.student_personal}&fl=s_id,student_name,student_age,grade
from=s_id:指定源core(student_record)的关联字段to=s_id:指定目标core(student_personal)的关联字段fromIndex=keyspace.student_personal:要关联的目标core名称fl参数:指定要返回的字段,把两张表的字段都列出来就能拿到合并后的结果
场景2:简单关联所有匹配记录(不带额外搜索条件)
如果只是想基于s_id关联两张表的所有匹配记录,可以用通配符查询:
http://localhost:8983/solr/keyspace.student_record/select?q=*:*{!join from=s_id to=s_id fromIndex=keyspace.student_personal}&fl=s_id,name,age,grade
注意事项
- 两个Solr core必须在同一个Solr实例(或SolrCloud集群)中,确保Solr能访问到目标core
- 关联字段
s_id在两个core中必须是可索引字段,字段类型要一致,否则会出现匹配失败的情况 - 如果查询没有返回预期结果,可以去Solr的日志里排查,常见问题比如字段不存在、core名称写错、字段类型不匹配等
备注:内容来源于stack exchange,提问作者iamvijay
相关产品推荐
相关产品推荐

