Solr Query Syntax and Parsing 查询语法
查询关键流程
1
SearchHandler.handleRequestBody( c.prepare(rb)--QueryComponent.prepare())--> SearchHandler.handleRequestBody( c.process(rb)--QueryComponentprocess())-->SearchHandler.handleRequestBody( c.finishStage(rb)--QueryComponent.finishStage())
QueryComponent.prepare中进行参数解析,得到QParser,Query,FilterQuery等
1
mm参数
- Solr’s mm parameter – Explanation of Min Number Should Match
- Min Number Should Match Specification Format
- Mininum Shoud Match-ES
- elasticsearch中minimum_should_match的一些理解
solr mm 参数例子
1,mm=a,a > 0 (clauses个数*百分数向下取整 < a)
首先依据分词得到clauses数,比如现在歌手字段(singer:简弘亦。对应ik分词结果为简,弘,亦三个) 然后搜索singer:小幸运简弘亦,此时依据ik分词为(小,幸运,简,弘,亦)类似于5个clauses,如果mm=1,mm=2或者mm=3都可以出搜索结果,是如果正数百分数,搜索词(小幸运简弘起)是5个clauses那么要想匹配上简弘亦,最终clauses个数百分数 的结果向下去整,必须小于3,这样当搜索词(小幸运简弘起)为是5个clauses,百分数最大为59%,即mm=2小于59%,需要match的clauses语句为数559%小于=2 如果搜索词是“小幸运简弘”或者 “幸运简弘起” 由于ik后是四个词,也就是4个clauses,那么最大74%,即4*74%小于3=2
分词(ik)与mm的一个坑(mm=100,也就是要求Query分词产生的每个clauses都必须匹配上)
搜索词 幸福蓝海(ik分词:幸福,蓝,海)
索引 幸福蓝海国际影城(ik分词:幸福,蓝,海国,国际,影城)
这个为啥坑呢:
- 首先是mm=100这个要求高了
- 再次要求从索引的序列中获取的正向子序列作为query产生的分词不能超出原索引序列的分词,当然如果如果query本身超出了索引的序列也是不行的