2

hibernate-searchを使用した検索に次のコードを使用しています。しかし、これは検索クエリをトークン化し、OR検索を実行しますが、私はAND検索を実行したいと思います。それ、どうやったら出来るの?

    FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
    String searchQuery = "test query";

    QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Customer.class).get();

    TermMatchingContext onFields = qb.keyword().onFields("customer.name","customer.shortDescription","customer.longDescription");

    org.apache.lucene.search.Query query = onFields.matching(searchQuery).createQuery();

    FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Customer.class);

    List<Customization> result = persistenceQuery.getResultList();
4

2 に答える 2

3

LuceneのデフォルトはORロジックですここで説明されているようにブールDSLクエリを使用できます-http://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#search-query-querydslただし、それでは問題が解決しない場合がありますそれでも、1つの文字列に両方のクエリ用語があるように見えるためです。ユースケースによっては(たとえば、検索文字列がユーザーによって提供された場合)、LuceneクエリパーサーからLuceneクエリを取得する方がよい場合があります。

于 2012-08-14T09:47:24.620 に答える
3
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Customer.class).get();
TermMatchingContext onFields = qb.keyword().onFields("customer.shortDescription",  "customer.longDescription");

BooleanJunction<BooleanJunction> bool = qb.bool();
org.apache.lucene.search.Query query = null;
String[] searchTerms = searchQuery.split("\\s+");
for (int j = 0; j < searchTerms.length; j++) {
   String currentTerm = searchTerms[j];
   bool.must(onFields.matching(currentTerm).createQuery());
}

query = bool.createQuery();

FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Customer.class);
resultList = persistenceQuery.getResultList();
于 2012-08-14T18:57:19.850 に答える