写这篇博客第一个是为了记录在solr中自定义queryParser(顺便介绍一下solr的queryParser),第二个是在 http://suichangkele.iteye.com/blog/2363599 (自定义得分的PrefixQuery)这篇博客中也说了要在solr中使用自己的query要使用自己的queryParser,第三个是公司业务需求,需要实现更加智能的搜索提示(智能是我自己给加的)。因为以上的原因我自己写了一个queryParser来实现我心中理想的搜索提示(先声明一下,我这里使用的是solr5.5.3的版本)。
1、solr中的queryParser:为什么我们在solr中设置q=*:*就能匹配所有的doc呢?为什么q=name:黄*就能匹配所有的name域是以黄开头的doc呢?原理就是solr使用queryParser将输入的q解析为了一个query,然后使用这个query进行了搜索。solr中有很多的queryParser,比如我们熟知的有lucene、dismax、edismax。我们从solr的源码中来仔细看一下吧:org.apache.solr.search.QParserPlugin在这个类中,可以发现有一个map,在加载org.apache.solr.search.QParserPlugin的时候就会忘这个map中添加很多的内容,在这个map中就能找到我们熟悉的lucene、dismax、edismax,不过他们都不是QueryParser,而是QParserPlugin,不过在QParserPlugin这个类中有createParser方法,用于产生一个QueryParser。我们在solrconfig.xml中可以配置QParserPlugin,在searchHandler中也可以配置defType表示使用的QParserPlugin,使用的名字就是在这个map中存放的内容。在org.apache.solr.search.QParserPlugin类中有一个默认的DEFAULT_QTYPE,也就是在一次查询的时候不指定de