4

我有以下带注释的类,我试图对来自 lucene/hibernate 搜索查询的结果进行排序。我终于让查询正常工作,但似乎当我实现必要的注释(在 jobStatus 上看到)来对该列进行排序时,就不可能再搜索该列。我的依据是我在 google 上找到的说明。我一直在解决整个休眠搜索和排序问题,现在我终于弄清楚了如何排序和搜索,我所需要的就是能够一起完成它们。

@Entity
@Table(name="jobReq")
@Indexed
public class JobReq {

@Id
@DocumentId
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;

@Field(index = Index.YES)
@Column(name="jobId", nullable=false, unique=true)
private String jobId;

@Field(index = Index.YES)
@Column(name="jobTitle", nullable=false)
private String jobTitle;

@Field(index = Index.YES)
@Column(name="jobContract", nullable=false)
private String contract;

@Field(index = Index.YES)
@Column(name="jobProject", nullable=true)
private String project;

@Field(index = Index.YES)
@Column(name="jobLaborCategory", nullable=false)
private String laborCategory;

@Field(index = Index.YES)
@Column(name="jobSummary", nullable=false)
private String summary;

@Field(index = Index.YES)
@Column(name="jobDescription", nullable=false)
private String jobDescription;

@Fields({@Field, @Field(analyze  = Analyze.NO, name = "jobStatus")})
@Column(name="jobStatus", nullable=false)
private String status;

@Field(index = Index.YES)
@Column(name="TTONumber", nullable=false)
private String TTONumber;

@Field(index = Index.YES)
@Column(name="jobPostedDate", nullable=false)
@Type(type="date")
private Date postedDate;

以及来自搜索功能的片段

Field[] allFields = this.type.getDeclaredFields();
SortField field =new SortField(sortColumn, SortField.STRING, reverseSort);
Sort sort = new Sort(field);
hibQuery = fullTextSession.createFullTextQuery(bq, this.type).setSort(sort);
results = hibQuery.list();
4

3 回答 3

5

Hibernate 搜索文档提供了一个类似于 Adam 的解决方案的解决方案。

https://docs.jboss.org/hibernate/search/5.11/reference/en-US/html_single/#fields-annotation

基本上使用两个 @Field 注释来索引一个字段两次,一次使用 Analyze.NO 进行排序,一次使用 Analyze.YES 进行搜索。

@Entity
@Indexed(index = "Book")
public class Book {

    @Field
    @Field(name = "summary_forSort", analyze = Analyze.NO, store = Store.YES)
    @SortableField(forField = "summary_forSort")
    public String getSummary() {
        return summary;
    }

    // ...
}

分析:确定是否分析该属性(Analyze.YES)或不分析(Analyze.NO)。默认值为Analyze.YES。

提示
是否要分析属性取决于您是要按原样搜索元素,还是要搜索它包含的单词。分析文本字段是有意义的,但可能不是日期字段。


不得分析用于排序或分面的提示字段。

于 2014-08-18T07:34:11.143 回答
3

事实证明,您无法在同一字段上进行排序和搜索,hibernate 书中的那篇文章有点误导。因此,对于修复,我在休眠论坛上找到了一个解决方案,即创建一个重复的“影子”列,一个被注释用于搜索,另一个被注释用于排序。

我花了一段时间才找到这个解决方案,主要是因为答案似乎有点“hack-y”,尽管相当直接和简单,复制数据在我的训练中一直是一个禁忌。但话又说回来,我猜你每天都会学到一些新东西。

于 2013-08-14T12:44:02.547 回答
1

两件事情:

  1. 在每一列上创建索引可能会损害性能,因为索引更新不是免费的。它还可以使用不必要的额外存储空间。当然,如果这对您来说实际上不是瓶颈,那也没关系。

  2. 您可以使用 Hibernate Criteria进行排序,例如:

    Criteria c = session.createCriteria(MyObject.class).addOrder(Order.desc(sortColumn));
    Query q = session.createFullTextQuery(bq).setCriteriaQuery(c);
    

    排序键列不需要被索引。

于 2013-08-12T20:09:37.900 回答