Java 如何对复杂类型的Hibernate搜索结果排序

Java 如何对复杂类型的Hibernate搜索结果排序,java,hibernate,lucene,hibernate-search,Java,Hibernate,Lucene,Hibernate Search,我想根据车牌和fleetCustomer.customerId后的订单模糊搜索所有车辆 到目前为止,我可以做模糊搜索,但排序部分,它似乎是很难做到我自己的时间,我有 hibernate搜索库的版本是5.5.5.final 我有两个实体: 车辆: @Entity @Table(name = "VEHICLE") @Indexed public class VehicleDao { @Id @GeneratedValue(strategy = GenerationType.AUTO

我想根据车牌和fleetCustomer.customerId后的订单模糊搜索所有车辆

到目前为止,我可以做模糊搜索,但排序部分,它似乎是很难做到我自己的时间,我有

hibernate搜索库的版本是5.5.5.final

我有两个实体:

车辆:

@Entity
@Table(name = "VEHICLE")
@Indexed
public class VehicleDao {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "vehicle_id")
    private Long vehicleId;

    @Column(name = "license_plate", length = 50)
    @Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
    private String licensePlate;

    @IndexedEmbedded
    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "fleetCustomer")
    @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED)
    private CustomerDao fleetCustomer;

    ...
}
客户:

@Embeddable
@Entity
@Table(name="CUSTOMER")
public class CustomerDao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CUSTOMER_ID", nullable = false)
    private Long customerId;

...

}
到目前为止,我尝试将ordering属性作为字段添加到搜索中,但这不起作用,不会返回任何结果

这就是我到目前为止所尝试的,模糊搜索正在发挥作用。 从代码中,您可以确定具有fleetCustomer.customerId=1025的车辆必须是第一辆

        org.apache.lucene.search.Query luceneQuery = b.bool()
                .must( b.keyword().fuzzy().onField("licensePlate").boostedTo(3)
                        .matching("mhp 070").createQuery() )
//        .must( b.keyword().onField("fleetCustomer.customerId").ignoreFieldBridge()
//                .matching("1025").createQuery() )
                .createQuery();

        final org.hibernate.search.jpa.FullTextQuery fullTextQuery =
                fullTextEntityManager.createFullTextQuery( luceneQuery , VehicleDao.class);

        fullTextQuery.setFirstResult(1);
        fullTextQuery.setMaxResults(5);

        List<T> resultList = fullTextQuery.getResultList();
org.apache.lucene.search.Query luceneQuery=b.bool()
.must(b.keyword().fuzzy().onField(“licensePlate”).boostedTo(3)
.matching(“mhp 070”).createQuery()
//.must(b.keyword().onField(“fleetCustomer.customerId”).ignoreFieldBridge()
//.matching(“1025”).createQuery()
.createQuery();
final org.hibernate.search.jpa.FullTextQuery FullTextQuery=
createFullTextQuery(luceneQuery,VehicleDao.class);
fullTextQuery.setFirstResult(1);
fullTextQuery.setMaxResults(5);
List resultList=fullTextQuery.getResultList();

非常感谢您的帮助。

如果您想对结果排序,您不应该更改查询。您应该添加一个排序

编辑:我没有看到您正在使用Search 5.5。下面是搜索5.5的解决方案。这个版本已经过时了,顺便说一下,如果可以的话,你应该考虑升级。

添加要根据客户ID排序的字段:

@Embeddable
@Entity
@Table(name="CUSTOMER")
public class CustomerDao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CUSTOMER_ID", nullable = false)
    @Field(name = "customerId_sort") // <== Add this
    @SortableField(forField = "customerId_sort")  // <== And this
    private Long customerId;

...

}
@Embeddable
@Entity
@Table(name="CUSTOMER")
public class CustomerDao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CUSTOMER_ID", nullable = false)
    @Field(name = "customerId_sort") // <== Add this
    @SortableField(forField = "customerId_sort")  // <== And this
    private Long customerId;

...

}
@可嵌入
@实体
@表(name=“客户”)
公共类客户道{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
@列(name=“CUSTOMER\u ID”,null=false)

@字段(name=“customerId\u sort”)//我不想对结果进行必要的排序,我只想将具有所需customerId的记录放在第一位。这与排序不同……谢谢您的帮助,对此我表示感谢,但我不知道您如何为查询提供预期的customerId值……好的,我不明白。为什么确切地说是do您希望某个特定项目位于顶部?是用户选择的某个元素?还是“特殊值”?如果是,除了使用其ID之外,还有什么方法可以识别该特殊值吗?我知道这篇文章已经过时了,但是如果此评论可以帮到您。您应该使用
should
关键字。请参阅。
@Embeddable
@Entity
@Table(name="CUSTOMER")
public class CustomerDao {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "CUSTOMER_ID", nullable = false)
    @Field(name = "customerId_sort") // <== Add this
    @SortableField(forField = "customerId_sort")  // <== And this
    private Long customerId;

...

}
        org.apache.lucene.search.Query luceneQuery = b.bool()
                .must( b.keyword().fuzzy().onField("licensePlate").boostedTo(3)
                        .matching("mhp 070").createQuery() )
                .createQuery();

        final org.hibernate.search.jpa.FullTextQuery fullTextQuery =
                fullTextEntityManager.createFullTextQuery( luceneQuery , VehicleDao.class);


        // Add this
        org.apache.lucene.search.Sort sort = b.sort().byField( "fleetCustomer.customerId_sort" ).createSort();
        fullTextQuery.setSort(sort);

        fullTextQuery.setFirstResult(1);
        fullTextQuery.setMaxResults(5);

        List<T> resultList = fullTextQuery.getResultList();