如何获取查询结果列表中每个对象的hibernate搜索分数

时间:2018-03-22 16:18:42

标签: lucene hibernate-search

这是我的代码

    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

这可能吗?

1 个答案:

答案 0 :(得分:0)

我建议重新考虑你的要求,看看你是否真的需要这个&#34;得分&#34;。如果你想要的是订购来自&#34;最匹配的&#34;对于&#34;最不匹配的&#34;,然后Hibernate Search(Lucene,实际上)默认已经这样做了。

现在,如果你真的需要这个&#34;得分&#34; ...最简单的方法可能是运行多个查询:

  • 第一个将是您的查询,
  • 第二个将是&#34; firstName&#34;仅限字段,以及ID上的其他过滤器,仅考虑与第一个查询匹配的实体
  • 第三个将是&#34; lastName&#34;仅限字段,以及ID上的其他过滤器,仅考虑与第一个查询匹配的实体
  • 第四个将是&#34;电话&#34;仅限字段,以及ID上的其他过滤器,仅考虑与第一个查询匹配的实体
  • 第五个将是&#34;电子邮件&#34;仅限字段,以及ID上的其他过滤器,仅考虑与第一个查询匹配的实体

然后,您可以针对第一个查询的每个结果计算有多少其他查询与之匹配。这将为您提供&#34;得分&#34;。

显然,性能不会很好,因为您将运行五个查询而不是一个。但至少它应该做你想做的事。

如果你想要更好的性能并且不怕困难......可能有办法计算匹配字段的数量并通过创建自己的Lucene Query实现将其用作分数,而不是使用默认的BooleanQuery(这是Hibernate Search查询构建器的功能)。但除非你对Lucene有深入了解,否则我不建议这样做:与Lucene内部合作真的不容易。此外,通过这样做,您将失去通过Lucene的默认分数对结果进行排序的能力,这是非常微妙的。

如果您想这样做,请查看org.apache.lucene.search.BooleanQueryorg.apache.lucene.search.BooleanWeightorg.apache.lucene.search.BooleanScorer的源代码。根据项目的许可条款,您可以复制/粘贴此代码,重命名类并更改代码以满足您的需求。我再次不建议那个。

相关答案:https://stackoverflow.com/a/48558309/6692043