Grails Lucene搜索排序

Grails Lucene搜索排序,grails,lucene,grails-searchable,Grails,Lucene,Grails Searchable,我需要搜索成员的名字和姓氏,我已经成功地做到了。 接下来我要做的是,成员的连接应该排在列表的第一位(按连接排序),就像在Facebook上一样,朋友排在列表的第一位,而不是社区的其他用户 我正在使用grails插件Searchable。一种简单的方法是将searchlist从searchablew.r.t.连接的列表中排序 下面是域结构 class Member extends { String firstName String lastName static sea

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

我正在使用grails插件Searchable。一种简单的方法是将
searchlist从searchable
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有什么方法可以做到这一点吗?

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

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

您是指grails的collect,据我所知,Lucene的API中没有collect方法。我不确定您使用的是
IndexSearcher
中的
search()
方法。在
indexsearch
中有一种方法
public void search(查询查询、筛选、收集器结果)
,我指的是
collect
中的
collect
方法。如果不使用此方法,我认为您可以编写自己的
类似的
Scorer
类来进行排序。或者,您可以添加一个术语并在索引步骤中给出相同的值,然后使用
关系
对此术语进行您自己的排序。我当前尝试的是为包含上述域类中提到的成员(connectedMember和member)的连接域类编制索引。我认为它可以解决这个问题。但是我注意到索引文件以前是6.5MB,现在是12MB。对这种方法有什么建议吗?我尝试了以下查询$/Connection/connectedMember/firstName:a*和$/Connection/member/id:14),其中14是登录成员的id。返回的任何文档都将是连接。