利用SOLR排序中的短语搜索

时间:2013-03-16 12:29:25

标签: sorting solr lucene full-text-search phrase

我发送给SOLR的搜索查询是:

?q=iphone 4s&sort=sold desc

默认搜索效果很好,但问题会在我想要的时候出现 例如,按某些字段对结果进行排序。已售出 - 已售出产品数量。

SOLR找到所有结果:(iphone 4s)或(iphone)或(4s) 因此,当我按字段“卖出”应用排序时,第一个结果是:“iPhone 3GS ......”这是问题。

我首先需要短语(“iphone 4s”)的结果,然后是结果的其余部分 - 全部按销售排序。

所以,问题是:

是否可以进行这样的查询,以及如何进行查询?

q=iphone 4s&sort={some algoritam for phrase results first} desc, sold desc

或者,我可以通过设置查询分析器来执行此操作吗?

目前通过向SOLR发送2个请求解决了这个问题, 首先使用短语“iphone 4s”,如果这返回0结果, 我执行了第二个请求,没有短语 - 只有:iphone 4s。

2 个答案:

答案 0 :(得分:0)

如果按分数,id,字段排序是不够的,Lucene允许您通过提供自己的FieldComparatorSource抽象基类的子类来实现自定义排序机制。

使用自定义排序逻辑,您可以实现实现需求的方式。

示例Java代码:

If(modelNum1.equals(modelNum2)){
//return based on number of units sold.
}else{
//ALWAYS return a value such that the preferred model beats others.
}

免责声明:这可能会导致维护问题,因为您必须在新手机型号到货时更改逻辑。

<强>步骤

1)Sort对象在实例化期间接受FieldComparatorSource类型实例。

2)扩展FieldComparatorSource

3)你必须在setNextReader()中的FieldComparatorSource中使用FieldCache加载参与'SORTING'的必填字段信息

4)重写FieldComparatorSource.newComparator()以返回自定义FieldComparator。

5)在方法FieldComparator.compare(slot1DocId,slot2DocId)中,您可以通过使用传入的docIds通过加载的FieldCache访问相应的字段信息来包含您的自定义逻辑。

将Lucene代码作为插件合并到Solr中应该不会给您带来麻烦..

答案 1 :(得分:0)

修改

无法在该功能中使用空格。期限只是没有空间。


  

从Solr3.1开始,也可以对任意函数查询进行排序   (如在FunctionQuery中),每个文档产生一个值。

因此,我将在排序

中使用函数 termfreq
  

termfreq(field,term)返回该术语出现的次数   该文件的字段。

搜索查询将

q=iphone 4s&sort=termfreq(product_name,"iphone 4s") desc, sold desc

注意:函数termfreq在Solr 4.0 version

中有效