2016-07-21 7 views
0

2つのエンティティがあり、第1のエンティティは第2のエンティティに参照されます。アクセス方法Hibernate Lucene Searchを使用してエンティティの外部キーのソートフィールド名を検索しますか?

エンティティ1:

@Indexed 
    public abstract class Yesh implements Serializable { 

    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "ID") 
    private Long id; 

    @Fields({ @Field(index = Index.YES, store = Store.NO), @Field(name = "YeshName_for_sort", index = Index.YES, analyzer = @Analyzer(definition = "customanalyzer")) }) 
    @Column(name = "NAME", length = 100) 
    private String name; 

    public Yesh() { 
    } 

    public Yesh (Long id) { 
     this.id = id; 
    } 

    public Yesh (Long id) { 
     this.id = id; 

    } 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 



    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    @Override 
    public String toString() { 
     return "com.Prac.Yesh[ id=" + id + " ]"; 
    } 

    } 

エンティティ2:

public class Kash implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @Id 
    @Basic(optional = false) 
    @Column(name = "ID") 
    private Long id; 

    @IndexedEmbedded 
    @ManyToOne 
    Yesh yes; //Contain reference to first entity 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 


    public Yesh getYes() { 
     return yes; 
    } 

    public void setId(Yesh yes) { 
     this.yes = yes; 
    } 
    } 

参照Yeshでエンティティ2には注釈がありません。エンティティ1は、 "YeshName_for_sort"という名前で注釈が付けられたフィールドを有する。

メインクラス:私は、次の例で与えられるフィールドの上にアクセスしようとする。しかし

FullTextEntityManager ftem = Search.getFullTextEntityManager(factory.createEntityManager()); 
QueryBuilder qb = ftem.getSearchFactory().buildQueryBuilder().forEntity(Kash.class).get(); 
org.apache.lucene.search.Query query = qb.all().getQuery(); 
FullTextQuery fullTextQuery = ftem.createFullTextQuery(query, Kash.class); 

//fullTextQuery.setSort(new Sort(new SortField("YeshName_for_sort", SortField.STRING, true))); 
    The above statement is not working and i have also tried to replace YeshName_for_sort with 'yes' reference but it is not working. 

fullTextQuery.setFirstResult(0).setMaxResults(150); 
int size = fullTextQuery.getResultSize(); 
    List<Yesh> result = fullTextQuery.getResultList(); 
    for (Yeshuser : result) { 
    logger.info("Yesh Name:" + user.getName()); 
    } 

ソートは動作しません。私はまた、のようなステートメントを変更しようとしました:

ftem.createFullTextQuery(query, Kash.class, Yesh.class); //added entity 1 

または

fullTextQuery.setSort(new Sort(new SortField("yes.name", SortField.STRING, true))); // Added property name for Yesh yes; 

が、それは動作しません。

エンティティで実装する必要がある注釈や、ソートのためにフィールドにアクセスするためのメインプログラムの変更はありますか?

答えて

1

を)。

@IndexedEmbeddedを使用する場合は、Luceneドキュメントにネストされたフィールドをドット表記で含めます。したがって

FullTextQuery fullTextQuery = ftem.createFullTextQuery(query, Kash.class); 
fullTextQuery.setSort(new Sort(new SortField("yes.YeshName_for_sort", SortField.STRING, true))); 

が動作するはずです。

Kashオブジェクトを検索してからYeshオブジェクトを操作するので、コードが一貫していないことに注意してください。私はコピー/パストだと思う。

インデックスがHibernate Searchによってどのように構築されるかについて少しお読みになることをお勧めします。これは、このようなことを理解しやすくなります。

+0

ありがとうございます。論理的に見える。最初のエンティティ(Yesh)が抽象的であるため、抽象クラスはインデックス文書を挿入できません "";それが働いていない理由。私はKashの索引を付けましたが、同じ問題です。それを解決する方法を探しています。そこにいくつかの文書があります。あなたが提案を持っている場合は、共有してください – fatherazrael

+0

抽象クラスに@ Indexedを追加することはできません。各子クラスに@ Indexedを定義する必要があります。つまり、Hibernate Searchは多態性をサポートしているので、抽象クラスを検索することができます。 –

+0

ありがとうございます。それをしました。私はルークを使用し、インデックスをチェックし、あなたが言及したように "yes.YeshName_for_sort"としてそれを格納していることがわかりました。私は抽象的なエンティティを索引付けしていませんが、それでもソートされた結果を表示していません "アナライザ= @Analyzer(定義=" customanalyzer "))"抽象クラスで動作しません。それをもっと見る。 – fatherazrael

0

私はこれがあなたのために働くが、sがそれを試してみるようにする予定であることをよく分からない: クラスYeshにプロパティnameに次の注釈を追加します。

@Fields({ 
      @Field, 
      @Field(name = "name_sort", analyze = Analyze.NO, store = Store.YES) 
      }) 
private String name; 

フィールドでクエリをソートする必要が分析されないフィールド。このプロパティの単語で検索してもソートしたい場合は、一度分析してから一度解析しないと、その単語を2回インデックスする必要があります。クエリで2番目に

したいソート適用:はいがタイプミスした場合は、その完全なパス、すなわちyes.YeshName_for_sort(またはyeshでフィールドを参照する必要があるので、あなたが@IndexedEmbedded使用している

ftem.createFullTextQuery(query, Kash.class, Yesh.class); 

fullTextQuery.setSort(new Sort(new SortField("name_sort", SortField.STRING, true))); 
+0

これは機能していません。すでに行っています。名前でソートする必要がありますので、分析が必要です。 – fatherazrael

関連する問題