【问题标题】:Sorting Lucene.net search results in a specific order按特定顺序对 Lucene.net 搜索结果进行排序
【发布时间】:2014-05-01 14:40:44
【问题描述】:

我们使用 Lucene.Net 在网站上进行产品搜索。对于一个类别,我们获取与具有类别唯一 ID 的字段类别完全匹配的所有产品。

对于一个客户,我们要求在没有其他标准的情况下按特定顺序列出产品。这些是按类别排列的,一个产品可以出现在多个类别中。所以我们不能只拥有一个全局订单字段。对于开箱即用的 Lucene.net 解决方案,我的第一个想法是为产品的每个类别设置一个字段,其中包含排序顺序。但是,如果有很多类别,这将无法很好地扩展。

一旦输入了搜索词或选择了一个方面,我们就会使用常规评分系统按照最佳匹配对产品进行排序。但是,当只有一个类别的术语查询时,我们希望能够按特定顺序对它们进行排序。

有没有办法使用可以接受 ID 列表或类似列表并据此对它们进行评分的自定义记分器来执行此操作?本质上,我们需要做的是按照数据库表或其他外部源中指定的顺序对 Lucene 搜索结果进行排序。

【问题讨论】:

    标签: c# sorting lucene.net


    【解决方案1】:

    这不是开箱即用的解决方案,我们使用的是 Open Search Server,我相信它是同一个搜索引擎的包装器。我们有类似的要求以及一大堆其他要求(复杂的过滤/权限/安全性),这些要求促使我们将搜索引擎的结果缓存在数据库中(它会在后台线程上对结果进行分页并将它们持久化到DB),之后您可以在您的数据库中的搜索结果和其他表之间进行连接,并对您的心脏内容进行索引排序。只是一个想法......

    【讨论】:

    • 感谢您的回答,我看过类似的东西,但希望有一个不涉及生成结果并将它们放在某个地方进行排序的解决方案,但可以只使用索引来完成
    【解决方案2】:

    在针对高流量网站的类似解决方案中,我们自己进行了排序。 Lucene 会找到结果,然后我们对它们进行动态排序并给出分页结果。大多数 .net 排序算法都足够高效,但我们使用了基数排序 (http://en.wikipedia.org/wiki/Radix_sort) 来让它按照我们的喜好执行。

    【讨论】:

    • 那不要求排名字段在搜索索引中吗?我希望有一个简洁的解决方案,这意味着我没有每个类别的字段可供排序,而是按来自外部源(例如数据库表)的任意顺序对索引进行排序
    【解决方案3】:


    我正在使用基于 Lucene 的 Elasticsearch,我这样做的方式是提升您希望元素排序的字段。
    第二种方法是纯Javascripthttp://isotope.metafizzy.co/,元素是动态渲染然后通过javascript排序的,请看一些例子,它可能对你有帮助! 编辑 : ALL 取决于您的逻辑:如果您想按类别订购:提升类别!

    场景:用户要求类别:移动,使用正常评分系统假设您有以下结果
    : 寻找诺基亚的用户

    product1:类别:汽车,标题:诺基亚汽车,分数:3.34
    product2:类别:电器,标题:酷诺基亚电器:得分 3.32
    product3:类别:手机,标题:诺基亚 3310:得分 2.32
    product4:类别:手机,标题:Nokia 6600:得分 2.31


    现在如果字段类别得到提升,您将拥有这个:
    product1:类别:手机,标题:Nokia 3310,得分:6.35
    product2:类别:手机,标题:Nokia 6600:得分 6.32
    product3:类别:电器,标题:其他诺基亚:得分 2.32
    product4:类别:汽车,标题:诺基亚汽车:得分 2.31

    我使用的分数是任意的

    【讨论】:

    • 但是如何在索引中包含我想要排序的字段,每个类别都包含一个字段吗?如果有 1000 个类别呢?
    • 您要订购还是分组?
    • 只是为了按任意顺序对结果进行排序,所以如果我想要 X 类中的所有产品,它们应该按照数据库表中指定的顺序显示。那些相同的产品可能属于 Y 类,但顺序不同,所以我不能在索引中只包含一个排名字段。
    • 它们不会按照数据库 order 中指定的顺序显示,而是按照索引 order 显示,如果你在 Lucene 中使用集群,则很难知道顺序。但回到光明的一面,如果你有一个名为 category 的字段,并且用户要求提供移动类别,如果类别字段被提升,他们将首先列出你在移动类别中的所有产品,即时订购跨度>
    • 好的,我对纯 JS 方法有疑问,因为我们需要支持禁用 JS 的用户。另一个问题是我只想要移动类别中的产品,没有其他产品,我希望它们按特定顺序排列,即数据库中定义的顺序
    猜你喜欢
    • 2016-01-09
    • 2013-08-19
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多