[Springboot] Elasticsearch Java API使って検索と削除

前回の投入に続き、検索と削除も試したのでメモ。(調べても全然HITしないのでひとまず動いたサンプルとして

環境

Java8
Springboot2.0.0
Gradle4.0
Elasticsearch6.2.3 ←5だとダメだった

依存関係

以下をbuild.gradleに追加

    compile group: 'org.elasticsearch', name: 'elasticsearch', version: '6.2.3'
    compile 'org.elasticsearch.client:elasticsearch-rest-high-level-client:6.2.3'

実装

例えば ユーザID AND 検索ワード(複数カラムのOR) みたいなクエリ

検索

@Service
public class ElasticSearchService {

    private String HOST = "localhost";
    private int PORT = 9200;
    private String SCHEME = "http";
    private String INDEX = "hoge-index";
    private String TYPE = "hoge-type";

    public void search(String userId, String keyword) {

        // 検索条件設定
        MultiSearchRequest multiSearchRequest = new MultiSearchRequest();
        SearchRequest searchRequest = new SearchRequest().indices(INDEX).types(TYPE);
        // ユーザID絞り込み
        SearchSourceBuilder builder = new SearchSourceBuilder().query(QueryBuilders.matchQuery("user_id", userId));
        // キーワード絞り込み
        if (!StringUtils.isEmpty(keyword)) {
            // OR条件
            builder.query(
                    QueryBuilders.boolQuery()
                            .should(QueryBuilders.matchQuery("column1", keyword))
                            .should(QueryBuilders.matchQuery("column2", keyword))
            );
        }
        // 重複除外(たぶん)
        builder.collapse(new CollapseBuilder("id"));
        // ソート
        builder.sort("sort_column");
        multiSearchRequest.add(searchRequest.source(builder));

        // 実行
        try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(HOST, PORT, SCHEME)))) {
            MultiSearchResponse response = client.multiSearch(multiSearchRequest);

            for (MultiSearchResponse.Item item : response) {

                // 結果取得
                List<String> jsonStringList = Arrays.stream((item.getResponse()).getHits().getHits()).map(SearchHit::getSourceAsString).collect(Collectors.toList());
                for (String json : jsonStringList) {
                    System.out.println(json);
                    // ここでJacksonとか使ってオブジェクトに変換したり
                }
            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

削除

IDで削除します

(省略)
    public void delete(String id) {
        try (RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost(HOST, PORT, SCHEME)))) {
            DeleteResponse response = client.delete(new DeleteRequest(INDEX, TYPE, id));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
(省略)

おわり

最近暖かくて心地よいです

サーバサイドエンジニア。オムライスが好物

シェアする

  • このエントリーをはてなブックマークに追加

フォローする