3

ユーザーがさまざまなドメイン要素を検索し、結果を組み合わせたリストとして表示できるようにする機能を提供する必要があります。そのため、UI では、テキスト フィールドを 1 つだけ入力し、結果を取得する必要があります。

視覚化するには、ドメインに 3 つのエンティティがあると仮定します。

@Document(indexName="car") 
public class Car { 
  private int id;
  private String type;
} 
@Document(indexName="garage")
public class Garage{ 
  private int id;
  private String address;
} 
@Document(indexName="shop")
public class Shop{ 
  private int id;
  private String name;
}

今、私は次のような要件を達成できると思いました:

...
@Inject
    private ElasticsearchTemplate elasticsearchTemplate;
...    
@RequestMapping(value = "/_search/all/{query}",
        method = RequestMethod.GET,
        produces = MediaType.APPLICATION_JSON_VALUE)
@Timed
public List<?> search(@PathVariable String query) {
     SearchQuery searchQuery = new NativeSearchQueryBuilder()
       .withQuery(queryString(query))
       .withIndices("car", "garage", "shop")
       .build();

    //THIS WORKS
    elasticsearchTemplate.queryForIds(searchQuery);

    //THIS THROWS ERROR ABOUT WRONG INDEXES
    return elasticsearchTemplate.queryForPage(searchQuery, GlobalSearchDTO.class, new GlobalSearchResultMapper()).getContent();
    }
...
    class GlobalSearchDTO {
        public Long id;
        public String type;
        public Object obj;
    }
 ...  

しかし、実際のドキュメントを返す 2 番目の関数を呼び出すと、次の例外がスローされます。

インデックス名を識別できません。GlobalSearchDTO はドキュメントではありません。ドキュメント クラスに @Document(indexName="foo") の注釈が付けられていることを確認してください。

ドメインエンティティをクラス引数として渡そうとしましたが、すべてではなく、対応するインデックスから要素のみを取得しています。たとえば、次のように呼び出します。

return elasticsearchTemplate.queryForPage(searchQuery, Shop.class, new GlobalSearchResultMapper()).getContent();

'shop' インデックスからのみ要素を取得します。何らかの理由で動的に提供されるインデックスが使用されていないようです。

問題は、そのようなデータを取得することは可能ですか? '.withIndices("car", "garage", "shop")' を指定するだけでは不十分なのはなぜですか?

たぶん、次のような他のソリューションを検討する必要があります。

  1. ループ内のインデックスを検索し (one bye one)、結果を結合してスコア順に並べ替えます

  2. 「globalsearch」インデックスを使用して個別の GlobalSearch エンティティを作成し
    、そこにデータを複製します

前もって感謝します!

クシシュトフ

4

1 に答える 1