Neo4j - 根据搜索用户时的适用性得分

dlv*_*dlv 3 java search neo4j

我需要根据他们的名字和姓氏在我的neo4j数据库中搜索用户.查询结果应根据它们与搜索查询的匹配程度进行排序.我们希望搜索输入为两个单词(对于第一个/最后一个或最后一个/第一个名称).

到目前为止我们一直在使用的查询搜索包含名字的用户,然后使用UNION ALL再次匹配用户但包含姓氏.假设搜索输入是"最后一个".所以我们的查询是:

MATCH (u:User) WHERE u.first_name =~'(?i).*first.*' RETURN u
UNION ALL u.last_name =~'(?i).*last.*' return u
UNION ALL u.first_name =~'(?i).*last.*' RETURN u
UNION ALL u.last_name =~'(?i).*first.*' return u
Run Code Online (Sandbox Code Playgroud)

因此,具有搜索输入的名字和姓氏的用户将在查询结果中出现两次.然后在java后端我们计算每个用户出现的次数(每个用户都有一个唯一的用户名),然后排序.

我想避免在java后端进行排序和计数,如果可能的话,只需使用单个查询.

任何帮助,将不胜感激.谢谢.

Fro*_*its 5

使用类似文本的搜索查询,cypher可能不会成为您想要这样做的方式.Neo4j实际上支持Apache Lucene实现的遗留索引,我推荐这些索引,因为它用于文本索引.Lucene甚至为您提供了丰富的查询语言来改善您的搜索.

如果你试着去密码路线,那么你最终会编写很多复杂的后端代码,而你的匹配仍然很幼稚; 在此示例中,您仍需要在姓氏和名字上进行字符匹配,并且关闭拼写错误将无法找到匹配.

遗留索引的文档从此处开始.请务必阅读"评分"子页面,因为最后,我认为这就是您想要的.还要确保检查lucene索引的额外功能,因为它将开始向您展示您可以使用Lucene做的更酷的事情(如复合查询),这是通过密码无法实现的.

好消息是neo4j可以做到这一点,而且效果非常好.坏消息是,这些东西中的一些只能通过java API获得,而且你不能直接从cypher那里做,就像你提供的例子所假设的那样.