用了这么就得solr也知道了solr的适用性在哪,它不适合于异常复杂的数据组合,就比如表与表是多对多的关系,适用于表结构比较简单,或者说查询的数据结构比较简单,而数据量特别的大特别的大,检索的条件也是非常的多,因为这样的东西在使用sql去处理时就可以明显知道,效率时特别的慢,而博主使用solr之前不是很深入这些东西,就属于第一种情况,查询的数据和需要检索的条件异常的复杂多变,查询的字段加上查询的字段加起来就有几百个,这些都不算什么,主要还是需要检索的数据的结构是很多的表进行关联的,一个主表有多个次表,次表下面还有多个关联表,真是太复杂了,但这样就明显出现了一个问题,那就是我们的solr导入的时候就是一条sql,如果直接关联查询导入的话,不仅是数据量大,而且会照成数据量的重复性特别多,比如我所做的属于桥梁方面的,一个桥的基本数据是一个表,而桥又多个大型的部件又是一个表,而部件里面又有不同形式的部件和不同的材料又一个一个表,并且里面还有形式的构件等等。。。。特别的复杂,这样就肯定不能关联起来,因为本来桥只是一万座桥,而把这些表全给关联起来,这样少也有上百万的数据量了,平均每座桥的基础数据都重复了百多次,这明显是不合理的,所以这个时候就想到了sql里面是怎样处理的,基础数据为一个sql,需要条件时,只要根据表与表之间的关联的条件进行查询出id在和基础表进行一个子查询就ok了,而solr里面有木有类型sql表关联的语法呢,博主各种百度各种找,找时找到了,却发现用不了,最后在技术群里面问大佬,才得于解决了,这个语法是真的非常得牛逼,完全满足了这种类似关联查询得情况,来看下重要语法----

 

{!join fromIndex=brdgConditionSearch toIndex=bridgeBasics from=brdgrecogID to=brdgrecogId} 条件(例:partsCode:1)

现在来将一下这个重要得语法是怎样用的,关联core:brdgConditionSearch       本身查询的core:bridgeBasics     字段brdgrecogID属于brdgConditionSearch关联core的字段,brdgrecogId属于bridgeBasics -core的,后面接着条件是关联表的条件,这就是一个固定的语法,必须完全匹配,否者就会报很多的不同的错误,比如写完关联语法后面没加关联core的条件的话,就会报500代码错误,比如core名称写错了就回报404错误,还有就是比如字段写错了,或者core和关联core写反了就会报字段未定义的错误。。关联条件就是两个core之间的关联字段,很好理解的,最后也是比较重要的一点,必须是放在一个q查询或者fq查询中,如果放在一个q或者fq查询中的时候还有其他的条件(不是关联core的条件也就是本core条件时)会报字段未定义或者时语法错误,所以这样很重要,现在来看下在solr界面使用的效果

MySQL left join 两个select 结果_后端

以上就是界面查询,关联core的条件都可以放在横线后面用字符串拼接就行,而本core查询的条件放在fq中就行了,

来在看下solrj代码是如何处理的

MySQL left join 两个select 结果_后端_02

如上所示,其实和solr界面都是一个意思,把关联条件放在一个方法中就可以了,就类似以solr中的一个fq,而如果有多个这样的查询,当然就可以使用多个这样的语法了,不过切记一个语法只能在一个fq中利用

头题我也说过,看语句这有点像是sql中的关联查询  --   类似

solr ----------
{!join fromIndex=brdgConditionSearch toIndex=bridgeBasics from=brdgrecogID to=brdgrecogId} 条件(例:partsCode:1)
sql -----------
 select 字段  from bridgeBasics s  left join brdgConditionSearch t ON t.brdgrecogID = s.brdgrecogId where partsCode=1

但是认真想想大家就会发现,语句感觉是差不多就是sql的关联查询,但是结果是完全不同的,solr这个语法其实是sql的子查询,并不是说什么关联查询,感觉就是因为网上的东西一直误导了我,所以就导致一直用不好这个语法,

真正类似sql子查询语句-----------

select 字段 from bridgeBasics s where s.brdgrecogId in(select t.brdgrecogID from brdgConditionSearch t where partsCode=1)

后面这些其实都不重要了,重要的是这个语法,由于我们用solr一般都是用于数据量比较大,而所查的字段不会是很麻烦的数据,但也难免会发生这种尴尬的事情,所以还是值得有这么个东西,其实这里还有一个问题就是如果查询的条件是关联core中的关联core中的条件,这个时候就特别头痛了,因为好像solr中似乎好像是真的没有这种跨core中的跨core的语法,不过数据量比较小的话还是可以解决的,就是使用条件在条件core中查询出跨core的跨core的关联字段,在把这个字段作为,跨core字段的条件就可以解决了,不过这样条件core查询出来的数据一定必须是很少的,因为这个时候是把这个查询出来的数据当条件了,一百个数据就是一百个条件一万一个数据就是一万个条件,所以一旦查询的数据超过五百这个时候就会出现效率非常的低了,至少得花五秒以上得时间查询,不过这也算是一种解决这种鬼问题得方法吧,因为我刚好遇到了这种事情,不过还好,条件core查询出来得数据比较少,不怎么影响效率。。。