【问题标题】:Give advantage to search by phrase in sort SOLR在 SOLR 排序中利用短语搜索
【发布时间】:2013-03-16 12:29:25
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如果按分数、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) 排序对象在实例化期间接受 FieldComparatorSource 类型实例。

    2) 扩展 FieldComparatorSource

    3) 您必须在 setNextReader() 中的 FieldComparatorSource 中使用 FieldCache 加载参与“排序”的必填字段信息

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

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

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

    【讨论】:

      【解决方案2】:

      编辑:

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


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

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

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

      搜索查询将是

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

      注意:函数 termfreq 从Solr 4.0 version激活

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-12
        • 1970-01-01
        • 2011-02-26
        相关资源
        最近更新 更多