【问题标题】:Lucene Search SortingLucene 搜索排序
【发布时间】:2013-09-11 13:31:37
【问题描述】:

我需要按名字和姓氏搜索成员,我已经成功完成了。 接下来我要做的就是成员的连接应该排在列表的首位(按连接排序。),就像在 Facebook 中一样,朋友排在列表的首位,而不是社区的其他用户。

我正在使用 grails 插件 Searchable。一种简单的方法是对searchListFromSearchable w.r.t 进行排序。连接列表。

以下是域结构。

class Member extends {

    String firstName
    String lastName

    static searchable = {
        analyzer "simple"
        only = ['firstName', 'lastName']
        firstName boost: 5.0
    }

    static hasMany = [connections: Connection]

}

连接类如下

class Connection {

    String uuid
    Member connectedMember
    static belongsTo = [member: Member]

}

有没有 lucene 方法可以做到这一点?

【问题讨论】:

    标签: grails lucene grails-searchable


    【解决方案1】:

    我认为您可以在 Lucene 的收集步骤或评分步骤中添加排序过程。我认为您首先获得关系,并且在搜索成员时,您可以检查该成员是否在关系中。如果成员在关系中,则可以添加该文档的分数,例如编写自己的收集器,扩展TopFieldDocCollector并在collect方法中在super.collect()之前添加score *= 10f

    【讨论】:

    • 你的意思是收集 grails,据我所知,Lucene 的 API 中没有收集方法。
    • 我不确定您使用IndexSearcher 中的哪个search() 方法。在IndexSearcher 中有一个方法public void search(Query query, Filter filter, Collector results),我的意思是在这个Collector 中的collect 方法。如果你不使用这种方法,我想你可以编写自己的SimilaryScorer 类来进行排序。或者您可以添加一个术语并在索引步骤中给出相同的值,然后使用 relationship 对该术语进行自己的排序。
    • 我目前正在尝试的是索引包含上述域类中提到的成员(connectedMember 和成员)的连接域类。我认为它可以解决问题。但是我注意到以前 6.5 MB 的索引文件现在是 12 MB。对这种方法有什么建议吗?
    • 我尝试了以下查询 $/Connection/connectedMember/firstName:a* AND $/Connection/member/id:14) 其中 14 是登录成员的 ID。返回的任何文档都将是连接。
    【解决方案2】:

    关于将好友 ID 添加到索引的解决方案。在这种情况下,您的搜索查询应该遵循 +name:firstName +name:lastNamefriend:userId^10 的形式。 friendId 有更大的提升,会在你的查询中让好友排名靠前。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多