Hibernate 全文搜索自定义顺序
Hibernate full text search custom order by
我们想为hibernate全文搜索添加自定义顺序,假设我们想根据位置搜索记录,如果位置是“country,state,city
然后我们想要搜索顶部靠近用户的记录
我们点击了以下链接。
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 table 列中作为 "India,Karnataka,Bangalore" 假设来自班加罗尔的用户登录我们需要首先在顶部显示来自班加罗尔的记录。
如果我们得到一些关于这个的信息,或者任何其他解决这个问题的方法,那将会很有帮助。
谢谢,
莫辛
听起来您不想按字面意思 'sort' 这些结果,但您希望与位置匹配的结果排名非常高,以便在执行按分数排序的查询时将它们放在首位.
请记住,默认情况下全文搜索会 return 结果按相关性排序,因此与查询最 相似 的匹配项将是 return 先编辑。
"similarity" 的概念是您可以控制的 - 这就是使用比关系查询更强大的全文引擎的意义所在。
因此,您可以通过添加带有 SHOULD 运算符的布尔子句并为其赋予强 "location" 匹配 "Bangalore" 的结果=31=]提升得分。
例如你可以:
Query combinedQuery = querybuilder
.bool()
.must( originalQuery )
.should( querybuilder.keyword().onField("location").matching(place_keyword).createQuery(); )
.createQuery();
请参阅文档的这些部分:
- Boosting 在分数计算中给予 "location" 字段更高的权重
- Combining queries
您可以通过对查询使用投影来验证提升和权重的计算方式。
您可以让它生成简单的分数,甚至可以完整解释为什么该分数具有该值;例如:
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 的内容以帮助理解评分系统和 "explanation" 公式。
我们想为hibernate全文搜索添加自定义顺序,假设我们想根据位置搜索记录,如果位置是“country,state,city
然后我们想要搜索顶部靠近用户的记录
我们点击了以下链接。
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 table 列中作为 "India,Karnataka,Bangalore" 假设来自班加罗尔的用户登录我们需要首先在顶部显示来自班加罗尔的记录。
如果我们得到一些关于这个的信息,或者任何其他解决这个问题的方法,那将会很有帮助。
谢谢, 莫辛
听起来您不想按字面意思 'sort' 这些结果,但您希望与位置匹配的结果排名非常高,以便在执行按分数排序的查询时将它们放在首位.
请记住,默认情况下全文搜索会 return 结果按相关性排序,因此与查询最 相似 的匹配项将是 return 先编辑。 "similarity" 的概念是您可以控制的 - 这就是使用比关系查询更强大的全文引擎的意义所在。
因此,您可以通过添加带有 SHOULD 运算符的布尔子句并为其赋予强 "location" 匹配 "Bangalore" 的结果=31=]提升得分。
例如你可以:
Query combinedQuery = querybuilder
.bool()
.must( originalQuery )
.should( querybuilder.keyword().onField("location").matching(place_keyword).createQuery(); )
.createQuery();
请参阅文档的这些部分:
- Boosting 在分数计算中给予 "location" 字段更高的权重
- Combining queries
您可以通过对查询使用投影来验证提升和权重的计算方式。 您可以让它生成简单的分数,甚至可以完整解释为什么该分数具有该值;例如:
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 的内容以帮助理解评分系统和 "explanation" 公式。