这是我的代码
luceneQuery = qb.bool()
.should(qb.keyword().onField("firstName").matching("abraham").createQuery())
.should(qb.keyword().onField("lastName").matching("lincoln").createQuery())
.should(qb.keyword().onField("phone").matching("9895873039").createQuery())
.should(qb.keyword().onField("email").matching("abraham@gmail.com").createQuery()).createQuery();
FullTextQuery query = fullTextEntityManager.createFullTextQuery(luceneQuery, Notes.class);
query.setProjection(
FullTextQuery.SCORE,
FullTextQuery.EXPLANATION,
FullTextQuery.THIS);
List<Object[]> results = query.getResultList();
for(Object[] a : results)
{
ObjectMapper om=new ObjectMapper();
Object[] firstResult = (Object[]) a;
String score = firstResult[0].toString();
String explanation = firstResult[1].toString();
Patients o = (Patients) firstResult[2];
log.debug("score query : " + score);
log.debug("explanation query : " + explanation);
log.debug("o query : " + om.writeValueAsString(o));
}
我需要的是,对于匹配所有字段的对象,得分为4
对于匹配任何3个字段的对象,得分为3
对于匹配任何2个字段的对象,得分为2
对于匹配任何1个字段的对象,得分为1
这可能吗?
答案 0 :(得分:0)
我建议重新考虑你的要求,看看你是否真的需要这个&#34;得分&#34;。如果你想要的是订购来自&#34;最匹配的&#34;对于&#34;最不匹配的&#34;,然后Hibernate Search(Lucene,实际上)默认已经这样做了。
现在,如果你真的需要这个&#34;得分&#34; ...最简单的方法可能是运行多个查询:
然后,您可以针对第一个查询的每个结果计算有多少其他查询与之匹配。这将为您提供&#34;得分&#34;。
显然,性能不会很好,因为您将运行五个查询而不是一个。但至少它应该做你想做的事。
如果你想要更好的性能并且不怕困难......可能有办法计算匹配字段的数量并通过创建自己的Lucene Query实现将其用作分数,而不是使用默认的BooleanQuery(这是Hibernate Search查询构建器的功能)。但除非你对Lucene有深入了解,否则我不建议这样做:与Lucene内部合作真的不容易。此外,通过这样做,您将失去通过Lucene的默认分数对结果进行排序的能力,这是非常微妙的。
如果您想这样做,请查看org.apache.lucene.search.BooleanQuery
,org.apache.lucene.search.BooleanWeight
和org.apache.lucene.search.BooleanScorer
的源代码。根据项目的许可条款,您可以复制/粘贴此代码,重命名类并更改代码以满足您的需求。我再次不建议那个。