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

基本的に、2 つの @Field アノテーションを使用して、ソート用に Analyze.NO で 1 回、検索用に Analyze.YES で 1 回、フィールドに 2 回インデックスを付けます。

@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 です。

ヒント
プロパティを分析するかどうかは、要素をそのまま検索するか、含まれる単語で検索するかによって異なります。テキスト フィールドを分析するのは理にかなっていますが、おそらく日付フィールドはそうではありません。

ヒント
ソートまたはファセットに使用されるフィールドは分析しないでください。

于 2014-08-18T07:34:11.143 に答える
1

2つのこと:

  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 に答える