2016-07-21 23 views
0

Es gibt zwei Entitäten und die erste Entität wird in die zweite Entität referenziert.Zugriff auf Sortieren Feldname von Fremdschlüssel in Entität mit Hibernate Lucene Search?

Entity 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 + " ]"; 
    } 

    } 

Entity 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; 
    } 
    } 

Es gibt keine Annotation in Entity 2 auf Referenz Yesh ist; Entität 1 hat ein Feld mit dem Namen "YeshName_for_sort". Aber wenn ich versuche, über Feld zuzugreifen, wie in folgendem Beispiel gegeben:

Hauptklasse:

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

Sortierung funktioniert nicht. Ich habe auch versucht, Aussagen zu ändern wie:

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

oder

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

aber es funktioniert nicht.

Welche Annotationen müssen in Entitäten oder Änderungen im Hauptprogramm implementiert werden, um auf das Sortierfeld zugreifen zu können?

Antwort

1

Sie @IndexedEmbedded verwenden, so dass Sie das Feld mit dem vollständigen Pfad nämlich yes.YeshName_for_sort (oder yesh wenn das ja ein Tippfehler war referenzieren).

Wenn Sie @IndexedEmbedded verwenden, fügen Sie die verschachtelten Felder in Ihrem Lucene-Dokument mit einer punktierten Notation ein.

So:

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

funktionieren sollte.

Beachten Sie, dass Ihr Code nicht wirklich konsistent ist, da Sie zunächst nach Kash-Objekten suchen und dann Yesh-Objekte bearbeiten. Ich nehme an, es ist eine Kopie/Pasto.

Ich empfehle Ihnen, ein wenig darüber zu lesen, wie die Indizes von Hibernate Search erstellt werden: es wird dann leichter für Sie sein, diese Art von Dingen zu verstehen.

+0

Danke. Sieht logisch aus. Habe gerade gesehen, dass die erste Entität (Yesh) abstrakt ist, also gibt sie -> "" Abstrakte Klassen können niemals Indexdokumente einfügen ""; der Grund, warum es nicht funktioniert. Ich habe das Kash indiziert, aber dasselbe Problem. Suche nach Möglichkeiten, es zu lösen.Wird einige Unterlagen darüber durchgehen. Wenn Sie irgendwelche Vorschläge haben, teilen Sie bitte – fatherazrael

+0

Sie können nicht @ Indiziert auf eine abstrakte Klasse hinzufügen, müssen Sie die @ indiziert für jede untergeordnete Klassen definieren. Davon abgesehen können Sie nach einer abstrakten Klasse suchen, da die Hibernate Search Polymorphie unterstützt. –

+0

Danke. Tat dies. Ich habe Luke benutzt und die Indexe überprüft und gefunden, dass es wie "yes.YeshName_for_sort" wie erwähnt gespeichert wird. Ich habe die abstrakte Entität nicht indiziert, aber sie zeigt immer noch keine sortierten Ergebnisse an. "Analyzer = @Analyzer (definition =" customanalyzer "))" funktioniert nicht in der abstrakten Klasse. Mehr dazu schauen. – fatherazrael

0

Ich bin nicht sicher, dass dies für Sie arbeiten wird, aber lassen Sie s, es zu versuchen: die folgende Anmerkung zu Eigenschaft hinzufügen name in der Klasse Yesh:

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

eine Abfrage durch Feldsortierung erfordert das Feld, das nicht analysiert werden soll. Wenn man nach Wörtern in dieser Eigenschaft suchen und sie trotzdem sortieren möchte, muss man sie zweimal indexieren - einmal analysiert und einmal nicht analysiert.

2. in Ihrer Anfrage gelten die Art Sie wollen:

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

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

Das funktioniert nicht, das habe ich schon gemacht. Wir müssen es nach Namen sortieren, daher ist eine Analyse erforderlich. – fatherazrael