2011-12-16 7 views
0

Webページ上の複数の入力フィールドにわたって洗練された自動脆弱性機能を実装するために、Hibernate Searchを使用したいと思います。 各入力フィールドはそれ自身のエンティティ用です。CountryCityとしましょう。両方のエンティティ間に多対1の関係があります。 (都市には国が含まれています)。Hibernate Search:埋め込みエンティティのクエリ方法

自動入力は、入力時などに有効です。国名プレフィックスと市区町村は既に埋め込まれていますが、 は、そのような都市を持つ国(またはその逆)の候補のみを表示します。

サーバ側の自動服務サービスは、入力フィールド(ドロップダウンなど)にレンダリングされる (entityId、entityName)の投影リストを返す必要があります。

スキーマによると、私は、次のインデックススキーマを試みマニュアル読んだ後:

SearchMapping mapping = new SearchMapping(); 

    mapping.analyzerDef(... 
    .entity(City.class).indexed().indexName("MyIndex") 
     .property("cityId", ElementType.FIELD) 
      .documentId() 
      .name("id") 
    .property("name", ElementType.FIELD) 
      .documentId() 
      .name("id") 
     .property("country", ElementType.METHOD) 
      .indexEmbedded() 
    .entity(Country.class).indexed() 
     .property("id", ElementType.FIELD) 
      .documentId() 
      .name("id") 
     .property("name", ElementType.METHOD) 
      .field() 
      .name("name") 

このマッピングは、右主エンティティであることCityを定義?
私はすべての都市のインデックスを作成しており、両方のフィールドを組み合わせてクエリを実行できます。しかし、私は都市を照会するときにだけマッチを得る。 つまり、 fullTextSession.getSearchFactory().buildQueryBuilder()。forEntity(City.class).get();のようなクエリを実行する場合。

「スペイン」と入力すると、これは国のフィールドでは役に立ちません。スペインの都市ごとに1つの行が表示されます。 (スペイン、スペイン、スペイン、スペイン、....-))

質問はです。どのように国のエンティティを検索することができますか?インデックス構造を変更しますか?インデックス作成の手順は?またはどのようにクエリするのですか?

私が見つけた唯一の方法は、countryのためのファセットをセットアップすることでした。また、あなたは自動挑戦としてさまざまなファセットを設定することができました。ただし、ファセットをアルファベット順にソートすることはできないため、これも完全ではありません。

もちろん、この例ではマッピングの両方のエンティティを切り替えることができますが、より複雑なエンティティグラフを使用するシナリオを想定します。

UPDATE:建物クエリについてコメント

に要求されたクエリを追加し、私はQueryBuilderを採用。私は国

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Country.class).get(); 

とクエリのクエリビルダを使用しようとすると

country.name:Spain 

:クエリと

fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(City.class).get(); 

:以下はスペインの例のように結果セットを生成し

name:Spain 

結果は得られません。

答えて

1

あなたは実際のクエリを表示していません。クエリーDSLを使用する必要はありませんが、ネイティブLuceneクエリーを記述することもできます。両方のケース(DSLまたはネイティブLucene)では、ブール論理を使用してクエリを組み合わせることができます。埋め込みエンティティはJava Beanの表記法に従います。国名は、たとえば市のクエリではcountry.nameとなります。繰り返しますが、あなたの実際の問い合わせがなければ、それ以上の具体的なフィードバックは得られません。

最後に、ファセットをアルファベット順にソートすることもできますが、 FacetSortOrder.COUNT_DESCを確認します。

+0

私は、特定の並べ替えオプション(私は推測すると、FacetSortOrder.FIELDVALUEと言いたい)を見ました。 コメントの第1部について:私の問題は、1つのクエリで条件を結合するのではなく、必要なエンティティを取得することです。返されたすべての行は条件に一致しますが、一致する国を取得したいと思います。国が「スペイン」と一致する都市は取得しません。私は質問を更新します。 – rainer198