繁体   English   中英

你能用Hibernate / Lucene对同一个字段进行排序和搜索吗?

[英]Can you sort and search on same field with Hibernate/Lucene?

我有以下带注释的类,我试图从lucene / hibernate搜索查询中对结果进行排序。 我终于让查询正常工作但似乎当我实现必要的注释(在jobStatus上看到)对该列进行排序时,它使得无法再搜索该列。 我基于谷歌这里找到的说明。 我一直在解决整个hibernate搜索和排序问题,现在我终于想出如何排序和搜索我需要的是能够一起完成它们。

@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();

Hibernate搜索文档提供了类似于Adam解决方案的此问题的解决方案。

http://docs.jboss.org/hibernate/search/4.5/reference/en-US/html_single/#d0e3165

基本上使用@Fields注释将字段索引两次,使用Analyze NO进行排序,使用analyze YES进行搜索一次。

@Entity
@Indexed(index = "Book")
public class Book {
@Fields( {
        @Field,
        @Field(name = "summary_forSort", analyze = Analyze.NO, store = Store.YES)
        } )
 public String getSummary() {
    return summary;
 }

 ...
}

analyze:确定是否分析属性(Analyze.YES)(Analyze.NO)。 默认值为Analyze.YES。 提示是否要分析属性取决于您是希望按原样搜索元素,还是按照其包含的字词搜索元素。 分析文本字段是有意义的,但可能不是日期字段。 提示不得分析用于排序或分面的字段。

事实证明你不能在同一个领域进行排序和搜索,这篇来自hibernate的书中的文章有点误导。 因此,为了解决问题,我在hibernate论坛上找到了一个解决方案 ,你创建了一个重复的“shadow”列,一个用于搜索,另一个用于排序。

我花了一段时间才找到这个解决方案,主要是因为答案看起来有点“黑客”,虽然相当直接和简单,复制数据在我的训练中一直是禁忌。 但是我想你每天都会学到新的东西。

两件事情:

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

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

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

    排序键列不需要编制索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM