2

我发送给 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。

4

2 回答 2

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 加载参与“排序”的必填字段信息

4) 覆盖 FieldComparatorSource.newComparator() 以返回您的自定义 FieldComparator。

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

将 Lucene 代码作为插件集成到 Solr 中应该不会给您带来麻烦。

于 2013-03-17T01:12:13.250 回答
0

编辑:

不能在该功能中使用空间。术语只有没有空格。


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

所以,我将在排序中使用函数termfreq

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

搜索查询将是

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

注意:函数 termfreq 从Solr 4.0 版本开始有效

于 2013-03-17T10:08:23.947 回答