JavaのElasticSearchでHibernateSearch 5.7.1.Final
を使用しています。 rank
とtitle
: 私はいくつかの共通の特性をクラスRecord
から継承し、共有し、私のモデルのオブジェクトの2つの主要なタイプ、 Book
とJournal
を、持っています。 書籍の一般的なランクは1
で、ジャーナルの標準値は です。2
ですが、場合によっては異なる場合もあります。HibernateSearchのクエリが更新されたデータでソートされない
私は、デフォルトのランクのいくつかのデータを作成したが、一冊の本 のために私は、ランク値の更新がクエリ結果で を尊重されるかどうかをテストしたかったです。私が最初にそれを保存する前に0
に値を設定
:
...
Book book03 = new Book("Special Book", prus);
book03.setRank(0);
session.save(book03);
それから私は、Hibernate(ないHibernateSearchに) メカニズムを使用してオブジェクトを取得し、その値を更新します。
今session.clear();
session.beginTransaction();
Criteria specialCriteria = session.createCriteria(Book.class);
Book special = (Book) specialCriteria.add(Restrictions.eq("title", "Special Book")).uniqueResult();
special.setRank(6);
session.saveOrUpdate(special);
session.getTransaction().commit();
私が欲しいですすべての本とジャーナルを入手し、ランクごとに並べ替えます。 ブーリアンクエリを使用して、本のクエリとジャーナルのクエリを結合します。 条件を含めずに、特定のタイプのすべてのオブジェクトを取得する方法がわからないので、タイトルに何かを持つオブジェクトについて をクエリします。
session.clear();
sessionFactory.getCache().evictEntityRegions();
FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.clear();
QueryBuilder bookQueryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Book.class).get();
QueryBuilder journalQueryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Journal.class).get();
QueryBuilder generalQueryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Record.class).get();
org.apache.lucene.search.Query bookLuceneQuery
= bookQueryBuilder.keyword().wildcard().onField("title").matching("*").createQuery();
org.apache.lucene.search.Query journalLuceneQuery
= journalQueryBuilder.keyword().wildcard().onField("title").matching("*").createQuery();
org.apache.lucene.search.Query combinedLuceneQuery = generalQueryBuilder
.bool()
.should(bookLuceneQuery)
.should(journalLuceneQuery)
.createQuery();
FullTextQuery combinedQuery = fullTextSession.createFullTextQuery(combinedLuceneQuery, Record.class);
Sort sort = generalQueryBuilder.sort()
.byField("rank").asc()
.createSort();
combinedQuery.setSort(sort);
List result = combinedQuery.list();
System.out.println("\n\nSearch results for books and journals:");
for(Object object : result)
{
Record record = (Record) object;
System.out.println(record.getTitle());
System.out.println(record.getRank());
System.out.println();
}
問題は、私は次のような結果を得ることです:
Special Book
6
book01
1
book02
1
book04
1
journal01
2
journal02
2
値が最終的に6
(がオブジェクトを印刷する場合、この値が表示されている)、 になく、中に更新のように見えます値0
をソートすると、 が使用されます(そのため、Special Book
が先頭に追加されます)。
ご覧のとおり、何もキャッシュされないようにセッションをリセットしようとしましたが、 が役に立ちませんでした。
私の別の仮説はrank
がソートに影響を与え唯一の要素 ではないですが、また問題が発生しないので、私はブール クエリを使用していないとき、いくつかの関連性を考え、 に入れているということです。私が本のみを求めるときは、Special Book
が結果リストの最後の です。しかし、結果を改ページできるように、組み合わせクエリ を使用することをお勧めします。 (それはElasticsearchを使用して、休止状態の検索、)デフォルトElasticsearchことで
'session.saveOrUpdate(special);' Elasticsearchを直接チェックして、 'SpecialBook'の値を確認しましたか?もしそうなら、それは6か0ですか? – Adonis
コードに* pauses *を追加し、ElasticSearchデータをダンプしました。最初のコードフラグメント実行後は0に設定され、2番目のコードフラグメントは6に設定され、このように維持されます(クエリの実行とソート中は6となります)。 – nuoritoveri