查询问题,最直接的反馈就是页面出来的结果。
然后牵扯到的问题就一步一步深入了。
第一层:queryparse,其中关联分词,关联booleanquery or phrasequery,关联boost。。。。
第二层:排序了,关联排序的策略、排序的得分公式
第三层:各种转换、过滤、筛选后的页面结果
这里重点将queryparse的问题。
对于boolean查询,可以完成细粒度的and or,但是,会损失查询term之间的关联关系,例如不能直接反应term直接的距离关系。例如 上架宝贝,分词是上架|宝贝,boolean查询可能对上架、宝贝都有结果,但是,上架宝贝挨着的不一定靠前。因为booleanquery 直接的形式,得分是各维度和。
对于phrasequery,顾名思义短语查询,更符合“搜索用语”特征,输入的是什么就搜索什么,只过滤停用词、非term词,信息损失相对较少,同时保留term之间关联关系。当然有扩展那就是“智能”了。phrasequery既然是分词后的多词组合,分词不可避免丢失中间某些单字,从而严格的“精准”去搜,导致有时候没有结果。
用户转为希望 上架宝贝,上架、宝贝都有结果,并且上架宝贝挨着的靠前,也有甚至理解 上架优先、其次宝贝、其次上架宝贝。众口难调!
各种queryparse就是本着灵活性、信息不失真(当然都是靠人为的干扰了,强制的boost或者改写)去理解用户输入串。dismaqueryparse相对stardqueryparse最大的不同是,前者得分是求max,后者得分是求和。前者是多域联合,域之间的关联兼顾,而后者忽略了域之间的关联性。
采取booleanquery,需要schema中配置
<fieldType name="text" class="solr.TextField" positionIncrementGap="100" >
solrconfig中配置
<luceneMatchVersion>LUCENE_34</luceneMatchVersion> //
更多信息请参考链接
http://solr.pl/en/2010/07/14/solr-and-phrasequery-phrase-bonus-in-query-stage/
http://wiki.apache.org/solr/DisMaxQParserPlugin
另外,booleanquery与phrasequery的选择,建议优先使用phrasequery。