Hibernate全文搜索自定义顺序

时间:2016-02-24 07:09:28

标签: hibernate sorting hibernate-criteria hibernate-search full-text-indexing

我们希望通过休眠全文搜索添加自定义顺序,假设我们想要根据位置搜索记录,如果位置是"国家,州,城市

然后我们希望搜索记录在顶部附近的用户

我们遵循以下链接。

using mysql "order by case" in hibernate criteria

但是当我们将order by子句添加到条件对象

时,它不会被添加

排序只在我们设置为如下所示的完整文本查询对象时起作用,这里我们只能做asc和desc,动态顺序不是。

Sort sort = new Sort( new SortField( "location", SortField.Type.STRING, false ) );
fullTextQuery.setSort( sort );

这是基于地理位置的搜索。

我们将位置值存储在mysql表列中作为"印度,卡纳塔克邦,班加罗尔"假设来自班加罗尔的用户登录我们需要首先显示来自班加罗尔的记录。

如果我们获得有关此问题或任何其他方式来解决此问题,将会有所帮助。

谢谢, 穆赫辛

1 个答案:

答案 0 :(得分:2)

听起来你不想真正“排序”那些结果,但你希望匹配位置的结果排名很高,所以在执行按分数排序的查询时将它们放在首位。

请记住,默认情况下,全文搜索会返回按相关性排序的结果,因此将首先返回与查询大多数相似的匹配项。 “相似性”的概念是您可以控制的 - 这就是使用比关系查询更强大的全文引擎的重点。

所以你可以通过在 SHOULD 运算符中添加一个布尔子句来获得与“班加罗尔”匹配的“位置”的结果,并在评分中给予强大的提升

例如你可以:

Query combinedQuery = querybuilder
   .bool()
      .must( originalQuery )
      .should( querybuilder.keyword().onField("location").matching(place_keyword).createQuery(); )
.createQuery();

请参阅文档的以下部分:

您可以使用带有查询的投影来验证如何计算增强和权重。 你可以让它产生简单的分数,甚至是为什么那个分数得到那个值的完整解释;例如:

org.hibernate.search.FullTextQuery query =
   s.createFullTextQuery(luceneQuery, YourEntity.class);
query.setProjection(
   FullTextQuery.SCORE,
   FullTextQuery.EXPLANATION,
   FullTextQuery.THIS);

List results = query.list();
Object[] firstResult = (Object[]) results.get(0);
float score = firstResult[0];
String explanation = firstResult[1];
YourEntity o = (YourEntity) firstResult[2];

最后,您还可以根据自己的喜好更改评分公式,或阅读the default Similarity implementation以了解评分系统和“解释”公式。