Solr 的edismax与dismax比较与分析


edismax支持boost函数与score相乘作为,而dismax只能使用bf作用效果是相加,所以在处理多个维度排序时,score其实也应该是其中一个维度 ,用相加的方式处理调整麻烦。

而dismax的实现代码逻辑比较简单,看起来比较易理解,edismax是它的加强版,其实是改变了不少。。比如在以下:

先看看dismax的解析主要实现思路:

首先取出搜索字段名qf

将最终解析成一个BooleanQuery

先解析主mainQuery:

  • 用户主要是搜索串的解析
  • altQuery解析处理,看是否使用用户定义的后备搜索串
  • PhraseQuery解析组装

再解析bq查询,主要是额外加分的查询,不会影响搜索结果数,只会影响排序

再则是bf解析,函数搜索最后会以加的方式作用于文档评分

看主要代码更清晰:

  1. @Override 
  2. public Query parse() throws ParseException { 
  3.   SolrParams solrParams = SolrParams.wrapDefaults(localParams, params); 
  4.  
  5.   queryFields = SolrPluginUtils.parseFieldBoosts(solrParams.getParams(DisMaxParams.QF)); 
  6.   if (0 == queryFields.size()) { 
  7.     queryFields.put(req.getSchema().getDefaultSearchFieldName(), 1.0f); 
  8.   } 
  9.    
  10.   /* the main query we will execute.  we disable the coord because 
  11.    * this query is an artificial construct 
  12.    */ 
  13.   BooleanQuery query = new BooleanQuery(true); 
  14.  
  15.   boolean notBlank = addMainQuery(query, solrParams); 
  16.   if (!notBlank) 
  17.     return null
  18.   addBoostQuery(query, solrParams); 
  19.   addBoostFunctions(query, solrParams); 
  20.  
  21.   return query; 
  • 1
  • 2
  • 3
  • 4
  • 下一页

相关内容