java - 您可以使用 Hibernate/Lucene 对同一字段进行排序和搜索吗?

标签 java hibernate sorting lucene hibernate-search

我有以下带注释的类,我正在尝试对来自 lucene/hibernate 搜索查询的结果进行排序。我终于让查询正常工作,但似乎当我实现必要的注释(在 jobStatus 上看到)对该列进行排序时,它使得无法搜索该列。我基于我找到的说明 here on google .我在计算整个 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 解决方案的解决方案。

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:确定属性是否被分析(Analyze.YES)或不被分析(Analyze.NO)。默认值为 Analyze.YES。

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

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

关于java - 您可以使用 Hibernate/Lucene 对同一字段进行排序和搜索吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18195367/

相关文章:

hibernate - 如何检查 isDirty ('transient_fieldName' ) 在 Grails 中的 transient 字段

hibernate - 嵌套异常是org.hibernate.exception.SQLGrammarException : could not extract ResultSet , Spring4,Hibernate4

java - Struts 2 Json 结果 Hibernate LazyInitialization - 如何在 hibernate session 中反序列化

javascript - AngularJS 按属性和自定义过滤器排序

Javascript 使用嵌套属性对对象数组进行排序,其中某些属性未定义

android - 按应用程序名称而不是包名称的字母顺序对 ListView 进行排序

java - Android,从SDK读取电子邮件

java - 是否有与 Java 中的 Scanner 类等效的单声道(.Net)

java - 如何使用 docker-compose.yaml 在 Airflow 容器中安装 java

java - 与android中的子字符串混淆