2016-06-30 5 views
0

Ich habe die Hibernate-Suche mit Apache Lucene konfiguriert, um nach gegebenen Koordinaten leichter suchen zu können. Jetzt frage ich mich, wie ich weitere Kriterien hinzufügen kann, um Entitäten zu suchen. Ich benutze auch Spring Data Projekt und Query DSL. Ich versuche, die Klasse Predicate von QueryDSL zu verwenden, um meine App konsistent zu halten. Es gibt eine Möglichkeit, dies zu tun?Kombination von QueryDSL mit Hibernate-Suche und Lucene

Mein Place.class

@Getter 
@Setter 
@Entity 
@Indexed 
@Spatial 
public class Place implements Serializable { 

    private static final long serialVersionUID = -8379536848917838560L; 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Id 
    @Column(name = "place_id") 
    private Long id; 

    //... 
    @Longitude 
    private Double lng; 

    @Latitude 
    private Double lat; 
    //... 
    } 

Mein Repository Klasse

@PersistenceContext(type = PersistenceContextType.EXTENDED) 
EntityManager em; 

@Override 
@Transactional 
public List findAll(Coordinates coordinates, Predicate predicate, Pageable pageable, int maxDistance) { 

    FullTextEntityManager fullTextSession = Search.getFullTextEntityManager(em); 

    QueryBuilder builder = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Place.class).get(); 

    org.apache.lucene.search.Query luceneQuery = builder 
      .spatial() 
      .within(maxDistance, Unit.KM) 
      .ofCoordinates(coordinates) 
      .createQuery(); 

    FullTextQuery jpaQuery = fullTextSession.createFullTextQuery(luceneQuery, Place.class); 
    return jpaQuery.getResultList(); 
} 

Antwort

1

Ich gehe davon aus Sie fragen nicht über mehrere Volltextabfragen mit einer Booleschen Abfrage kombiniert - wie ich die Hoffnung Dokumente haben genug Beispiele dafür - aber Sie fragen nach SQL-basierten Einschränkungen hinzufügen.

In der Praxis ist es möglich, eine FullTextQuery durch Anwenden einer Criteria weiter einzuschränken, obwohl dies scheint zu funktionieren, war diese Funktion nicht beabsichtigt (lustige Geschichte dahinter!), Ist schlecht getestet und ist überhaupt nicht effizient: zu vermeiden wenn möglich. Es wurde nicht entfernt, da manche Leute es wirklich mögen.

Sie ein Beispiel finden kann - und Warnungen über die Grenzen - im Beispiel „5.12 Festlegen von FetchMode auf einer Abfrage.“: - http://docs.jboss.org/hibernate/search/5.6/reference/en-US/html_single/

Eine bessere Lösung ist nur eine Volltext-Abfrage auszuführen, durch die Beschränkung auf indizierten Feldern, sodass die Abfrage nur von Lucene vollständig aufgelöst werden kann.

Manchmal hilft es, zusätzliche Felder im Index zu codieren, irgendwie "Luke-Dokument" vor dem Markieren, das Sie abgleichen möchten. Hier müssen die Leute ein bisschen kreativ werden, und Sie könnten einige benutzerdefinierte FieldBridge und ClassBridge Implementierungen schreiben.

Dann wenden Sie eine Full-Text Filter an, oder kombinieren Sie mehrere Abfragen mit booleschen Abfragen: siehe Abschnitt "5.1.2.8. Abfragen kombinieren".

+0

Ich suchte nach Möglichkeit, Lucene-Abfrage mit meinen eigenen SQL-Abfragen/Kriterien zu kombinieren, weil ich mehr Selbstvertrauen mit SQL als Lucene fühle, aber danke. Ich habe getan was ich will und es funktioniert hervorragend. –