Grails Lucene搜索排序
我需要搜索成员的名字和姓氏,我已经成功地做到了。 接下来我要做的是,成员的连接应该排在列表的第一位(按连接排序),就像在Facebook上一样,朋友排在列表的第一位,而不是社区的其他用户 我正在使用grails插件Searchable。一种简单的方法是将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
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。返回的任何文档都将是连接。