gpt4 book ai didi

Hibernate 全文搜索自定义顺序

转载 作者:行者123 更新时间:2023-12-02 01:28:23 25 4
gpt4 key购买 nike

我们想给hibernate全文搜索添加自定义order by,假设我们想根据位置搜索记录,如果位置是“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 表列中作为“India,Karnataka,Bangalore”假设来自 Bangalore 的用户登录我们需要首先在顶部显示来自 Bangalore 的记录。

如果我们得到一些关于这个的信息,或者任何其他解决这个问题的方法,那将会很有帮助。

谢谢,莫辛

最佳答案

听起来您不想按字面意思对这些结果进行“排序”,但您希望与位置匹配的结果排名非常靠前,以便在执行按分数排序的查询时将它们排在最前面。

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

因此,您可以通过添加带有 SHOULD 运算符的 bool 子句来获得“位置”与“类加罗尔”匹配的结果,并在评分中给予强烈的提升 .

例如你可以:

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帮助理解评分系统和“解释”公式。

关于Hibernate 全文搜索自定义顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35595515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com