{"id":3573,"date":"2021-10-04T20:28:04","date_gmt":"2021-10-04T11:28:04","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=3573"},"modified":"2021-10-04T20:29:43","modified_gmt":"2021-10-04T11:29:43","slug":"spring-boot-elasticsearch-api-%ec%82%ac%ec%9a%a9%ed%95%98%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=3573","title":{"rendered":"Spring Boot ElasticSearch API \uc0ac\uc6a9\ud558\uae30"},"content":{"rendered":"<h1>Spring Boot ElasticSearch API \uc0ac\uc6a9\ud558\uae30<\/h1>\n<p>Spring Boot ElasticSearch API \uc5d0 \ub300\ud55c \ubb38\uc11c\uac00 \uc798 \uc5c6\uc5b4,<br \/>\n\uc791\uc5c5\uc911\uc778 \uc18c\uc2a4\ucf54\ub4dc\ub97c \uacf5\uac1c\ud569\ub2c8\ub2e4.<\/p>\n<h2>BoolQueryBuilder<\/h2>\n<pre><code class=\"language-java\">    @Override\n    public SearchResponseDto search(Map&lt;String, String&gt; params) throws UnsupportedEncodingException {\n\n        ESRestaurantInfoSearchDto searchDto = new ESRestaurantInfoSearchDto(params);\n        Pageable pageable = PageRequest.of(searchDto.getPageNo(), searchDto.getPageSize());\n\n        BoolQueryBuilder filterBoolQueryBuilder = boolQuery();\n        BoolQueryBuilder shouldBoolQueryBuilder = boolQuery();\n\n        if ((searchDto.getLongitudeStart() != 0.0) &amp;&amp; (searchDto.getLongitudeEnd() != 0.0)) {\n            filterBoolQueryBuilder.filter(QueryBuilders\n                    .rangeQuery(&quot;longitude&quot;)\n                    .from(searchDto.getLongitudeStart())\n                    .to(searchDto.getLongitudeEnd()));\n        }\n\n        if ((searchDto.getLatitudeStart() != 0.0) &amp;&amp; (searchDto.getLatitudeEnd() != 0.0)) {\n            filterBoolQueryBuilder.filter(QueryBuilders\n                    .rangeQuery(&quot;latitude&quot;)\n                    .from(searchDto.getLatitudeStart())\n                    .to(searchDto.getLatitudeEnd()));\n        }\n\n        shouldBoolQueryBuilder\n                .should(matchQuery(&quot;restaurant_name&quot;, searchDto.getQueryString()).operator(Operator.OR))\n                .should(matchQuery(&quot;restaurant_name&quot;, searchDto.getQueryString()).operator(Operator.AND).boost(5.0f))\n                .should(matchPhraseQuery(&quot;restaurant_name&quot;, searchDto.getQueryString()).boost(25.0f));\n\n        NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();\n        queryBuilder\n                .withFilter(filterBoolQueryBuilder)\n                .withPageable(pageable)\n                .withQuery(shouldBoolQueryBuilder);\n\n        SearchHits&lt;ESRestaurantInfo&gt; articles = operations\n                .search(queryBuilder.build(), ESRestaurantInfo.class, IndexCoordinates.of(&quot;restaurant_info&quot;));\n\n        List&lt;SearchHit&lt;ESRestaurantInfo&gt;&gt; searchHitList = articles.getSearchHits();\n        ArrayList&lt;ESRestaurantInfo&gt; list = new ArrayList&lt;&gt;();\n\n        for (SearchHit&lt;ESRestaurantInfo&gt; item : searchHitList) {\n            list.add(item.getContent());\n        }\n        List&lt;Object&gt; results = Arrays.asList(toDto(list).toArray());\n\n        int totalCount = (int) articles.getTotalHits();\n\n        return new SearchResponseDto(results, pageable, totalCount);\n    }<\/code><\/pre>\n<h2>\ucffc\ub9ac \uc0dd\uc131\uacb0\uacfc<\/h2>\n<pre><code class=\"language-json\">GET \/restaurant_info\/_search\n{\n  &quot;from&quot;: 0,\n  &quot;size&quot;: 100,\n  &quot;query&quot;: {\n    &quot;bool&quot;: {\n      &quot;should&quot;: [\n        {\n          &quot;match&quot;: {\n            &quot;restaurant_name&quot;: {\n              &quot;query&quot;: &quot;\uce7c\uad6d\uc218&quot;,\n              &quot;operator&quot;: &quot;OR&quot;,\n              &quot;prefix_length&quot;: 0,\n              &quot;max_expansions&quot;: 50,\n              &quot;fuzzy_transpositions&quot;: true,\n              &quot;lenient&quot;: false,\n              &quot;zero_terms_query&quot;: &quot;NONE&quot;,\n              &quot;auto_generate_synonyms_phrase_query&quot;: true,\n              &quot;boost&quot;: 1.0\n            }\n          }\n        },\n        {\n          &quot;match&quot;: {\n            &quot;restaurant_name&quot;: {\n              &quot;query&quot;: &quot;\uce7c\uad6d\uc218&quot;,\n              &quot;operator&quot;: &quot;AND&quot;,\n              &quot;prefix_length&quot;: 0,\n              &quot;max_expansions&quot;: 50,\n              &quot;fuzzy_transpositions&quot;: true,\n              &quot;lenient&quot;: false,\n              &quot;zero_terms_query&quot;: &quot;NONE&quot;,\n              &quot;auto_generate_synonyms_phrase_query&quot;: true,\n              &quot;boost&quot;: 5.0\n            }\n          }\n        },\n        {\n          &quot;match_phrase&quot;: {\n            &quot;restaurant_name&quot;: {\n              &quot;query&quot;: &quot;\uce7c\uad6d\uc218&quot;,\n              &quot;slop&quot;: 0,\n              &quot;zero_terms_query&quot;: &quot;NONE&quot;,\n              &quot;boost&quot;: 25.0\n            }\n          }\n        }\n      ],\n      &quot;adjust_pure_negative&quot;: true,\n      &quot;boost&quot;: 1.0\n    }\n  },\n  &quot;post_filter&quot;: {\n    &quot;bool&quot;: {\n      &quot;filter&quot;: [\n        {\n          &quot;range&quot;: {\n            &quot;longitude&quot;: {\n              &quot;from&quot;: 126.93452195073536,\n              &quot;to&quot;: 126.94537104338305,\n              &quot;include_lower&quot;: true,\n              &quot;include_upper&quot;: true,\n              &quot;boost&quot;: 1.0\n            }\n          }\n        },\n        {\n          &quot;range&quot;: {\n            &quot;latitude&quot;: {\n              &quot;from&quot;: 37.48608721246216,\n              &quot;to&quot;: 37.49363416030283,\n              &quot;include_lower&quot;: true,\n              &quot;include_upper&quot;: true,\n              &quot;boost&quot;: 1.0\n            }\n          }\n        }\n      ],\n      &quot;adjust_pure_negative&quot;: true,\n      &quot;boost&quot;: 1.0\n    }\n  },\n  &quot;version&quot;: true,\n  &quot;explain&quot;: false\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring Boot ElasticSearch API \uc0ac\uc6a9\ud558\uae30 Spring Boot ElasticSearch API \uc5d0 \ub300\ud55c \ubb38\uc11c\uac00 \uc798 \uc5c6\uc5b4, \uc791\uc5c5\uc911\uc778 \uc18c\uc2a4\ucf54\ub4dc\ub97c \uacf5\uac1c\ud569\ub2c8\ub2e4. BoolQueryBuilder @Override public SearchResponseDto search(Map&lt;String, String&gt; params) throws UnsupportedEncodingException { ESRestaurantInfoSearchDto searchDto = new ESRestaurantInfoSearchDto(params); Pageable pageable = PageRequest.of(searchDto.getPageNo(), searchDto.getPageSize()); BoolQueryBuilder filterBoolQueryBuilder = boolQuery(); BoolQueryBuilder shouldBoolQueryBuilder = boolQuery(); if ((searchDto.getLongitudeStart() != 0.0) &amp;&amp; (searchDto.getLongitudeEnd() != 0.0)) { filterBoolQueryBuilder.filter(QueryBuilders\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=3573\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[],"class_list":["post-3573","post","type-post","status-publish","format-standard","hentry","category-elasticsearch"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/3573","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3573"}],"version-history":[{"count":2,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/3573\/revisions"}],"predecessor-version":[{"id":3575,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/3573\/revisions\/3575"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3573"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3573"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3573"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}