2016-06-30 5 views
0

私はApache LuceneでHibernate Searchを設定して、与えられた座標でより簡単にenititesを検索しました。今、検索エンティティにどのように基準を追加することができますか?私はSpring DataプロジェクトとQuery DSLも使用しています。私はPredicate QueryDSLのクラスを使用して、私のアプリケーションの一貫性を維持しようとしています。これを行う可能性はありますか?QueryDSLとHibernate SearchとLuceneを組み合わせる

マイ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; 
    //... 
    } 

マイリポジトリクラス

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

答えて

1

私はあなたがブールクエリで複数のフルテキストクエリを組み合わせることについて尋ねていないと仮定しています - 私は期待してドキュメントには十分な例がありますが、SQLベースの制限を追加することを求めています。

実際には、Criteriaを適用してさらにFullTextQueryを制限することはできますが、この機能は意図的ではありませんでしたが、この機能は意図的なものではありませんでした。可能なら。それは本当に好きな人もいますが、削除されませんでした。

あなたが例を見つけることができる - と限界についての警告 - 例では、「5.12の指定FetchModeをクエリに。」: - http://docs.jboss.org/hibernate/search/5.6/reference/en-US/html_single/

より良い解決策だけ制限することにより、フルテキストクエリを実行することですインデックス付きフィールドでは、Luceneのみでクエリを完全に解決できるようになりました。

場合によっては、インデックスに追加フィールドをエンコードすることもできます。これは、一致させたいLuceneドキュメントを「事前にタグ付け」することがあります。これは人々が少し創造的にする必要があるところであり、カスタムのFieldBridgeClassBridgeの実装を書くかもしれません。

次に、Full-Text Filterを適用するか、複数のクエリをブールクエリと組み合わせます(「5.1.2.8。クエリの結合」を参照)。

+0

私はluceneではなくsqlの方がより自信を持っているので、自分のSQLクエリ/基準とluceneクエリを組み合わせる方法を探していましたが、ありがとうございました。私は欲しいものをやったことがあり、それは素晴らしい作品です。 –

関連する問題