{"id":1109,"date":"2023-03-12T11:45:52","date_gmt":"2023-03-12T03:45:52","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1109"},"modified":"2023-04-29T11:24:00","modified_gmt":"2023-04-29T03:24:00","slug":"elasticsearch-7-learning-nba-china-official-website-practice","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/12\/elasticsearch-7-learning-nba-china-official-website-practice\/","title":{"rendered":"ElasticSearch 7 \u5b66\u4e60\uff0814\uff09NBA\u4e2d\u56fd\u5b98\u7f51\u5b9e\u6218"},"content":{"rendered":"<p>\u5b98\u65b9\u7f51\u7ad9\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/china.nba.com\/playerindex\/\">https:\/\/china.nba.com\/playerindex\/<\/a><\/p>\n<h2>\u9879\u76ee\u642d\u5efa<\/h2>\n<p>Spring Boot \u6574\u5408 ElasticSearch \u548c MySQL<\/p>\n<p><!-- more --><\/p>\n<h3>POM\u4f9d\u8d56<\/h3>\n<pre><code class=\"language-xml\">&lt;!-- elasticsearch-rest-high-level-client --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.elasticsearch.client&lt;\/groupId&gt;\n    &lt;artifactId&gt;elasticsearch-rest-high-level-client&lt;\/artifactId&gt;\n    &lt;version&gt;7.2.1&lt;\/version&gt;\n&lt;\/dependency&gt;\n&lt;!-- elasticsearch --&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.elasticsearch&lt;\/groupId&gt;\n    &lt;artifactId&gt;elasticsearch&lt;\/artifactId&gt;\n    &lt;version&gt;7.2.1&lt;\/version&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<h3>YML\u4f9d\u8d56<\/h3>\n<pre><code class=\"language-yaml\">elasticsearch:\n  host: localhost\n  port: 9200<\/code><\/pre>\n<h3>ElasticSearch\u914d\u7f6e\u6587\u4ef6<\/h3>\n<pre><code class=\"language-java\">package com.frame.elasticsearch.config;\n\nimport lombok.Data;\nimport org.apache.http.HttpHost;\nimport org.elasticsearch.client.RestClient;\nimport org.elasticsearch.client.RestHighLevelClient;\nimport org.springframework.boot.SpringBootConfiguration;\nimport org.springframework.boot.context.properties.ConfigurationProperties;\nimport org.springframework.context.annotation.Bean;\n\n\/**\n * ElasticSearch\u914d\u7f6e\u6587\u4ef6\n * ES7\u4f7f\u7528RestHighLevelClient\u64cd\u4f5cES\n *\/\n@SpringBootConfiguration\n@ConfigurationProperties(prefix = &quot;elasticsearch&quot;)\n@Data\npublic class ElasticSearchConfig {\n    private String host;\n    private Integer port;\n\n    \/**\n     * \u521b\u5efaRestHighLevelClient \u5b9e\u4f8b\n     *\/\n    @Bean\n    public RestHighLevelClient restHighLevelClient() {\n        HttpHost http = new HttpHost(host, port, &quot;http&quot;);\n        return new RestHighLevelClient(RestClient.builder(http));\n    }\n}<\/code><\/pre>\n<h3>ElasticSearch CRUD\u5165\u95e8\u64cd\u4f5c<\/h3>\n<ul>\n<li>\u5bf9\u8c61\u8f6cMap\u5de5\u5177\u7c7b<\/li>\n<\/ul>\n<pre><code class=\"language-java\">import org.springframework.cglib.beans.BeanMap;\n\nimport java.util.HashMap;\nimport java.util.Map;\n\npublic class BeanUtils {\n    \/**\n     * \u5bf9\u8c61\u8f6c\u4e3aMap\n     *\/\n    public static &lt;T&gt; Map&lt;String, Object&gt; beanToMap(T bean) {\n        HashMap&lt;String, Object&gt; map = new HashMap&lt;&gt;();\n        if (bean != null) {\n            BeanMap beanMap = BeanMap.create(bean);\n            for (Object o : beanMap.keySet()) {\n                if (beanMap.get(o) != null) {\n                    map.put(o.toString(), beanMap.get(o));\n                }\n            }\n        }\n        return map;\n    }\n}<\/code><\/pre>\n<ul>\n<li>CRUD \u5b9e\u73b0\u65b9\u6cd5<\/li>\n<\/ul>\n<pre><code class=\"language-java\">import com.alibaba.fastjson.JSON;\nimport com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;\nimport com.frame.common.entity.NbaPlayer;\nimport com.frame.common.utils.BeanUtils;\nimport com.frame.elasticsearch.mapper.NbaPlayerMapper;\nimport com.frame.elasticsearch.service.NbaPlayerService;\nimport org.elasticsearch.action.delete.DeleteRequest;\nimport org.elasticsearch.action.delete.DeleteResponse;\nimport org.elasticsearch.action.get.GetRequest;\nimport org.elasticsearch.action.get.GetResponse;\nimport org.elasticsearch.action.index.IndexRequest;\nimport org.elasticsearch.action.index.IndexResponse;\nimport org.elasticsearch.action.update.UpdateRequest;\nimport org.elasticsearch.action.update.UpdateResponse;\nimport org.elasticsearch.client.RequestOptions;\nimport org.elasticsearch.client.RestHighLevelClient;\nimport org.elasticsearch.index.reindex.BulkByScrollResponse;\nimport org.elasticsearch.index.reindex.DeleteByQueryRequest;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.stereotype.Service;\n\nimport java.io.IOException;\nimport java.util.Map;\n\n\/**\n * &lt;p&gt;\n * \u670d\u52a1\u5b9e\u73b0\u7c7b\n * &lt;\/p&gt;\n *\n * @author Crazy.X\n * @since 2019-11-10\n *\/\n@Service\npublic class NbaPlayerServiceImpl implements NbaPlayerService {\n\n    \/* ES\u7d22\u5f15 *\/\n    private final String NBA_INDEX = &quot;nba_latest&quot;;\n\n    @Autowired\n    private RestHighLevelClient restHighLevelClient;\n\n    \/**\n     * \u6dfb\u52a0\u4e00\u6761\u6587\u6863\n     *\/\n    @Override\n    public boolean addPlayer(NbaPlayer player, String id) throws IOException {\n        \/\/ \u83b7\u53d6 IndexRequest\n        IndexRequest request = new IndexRequest(NBA_INDEX)\n                .id(id)\n                .source(BeanUtils.beanToMap(player));\n        \/\/ \u83b7\u53d6 IndexResponse\n        IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);\n        System.out.println(JSON.toJSONString(response));\n        return false;\n    }\n\n    \/**\n     * \u83b7\u53d6\u4e00\u6761\u6587\u6863\n     *\/\n    @Override\n    public Map&lt;String, Object&gt; getPlayer(String id) throws IOException {\n        \/\/ \u83b7\u53d6 GetRequest\n        GetRequest getRequest = new GetRequest(NBA_INDEX, id);\n        \/\/ \u83b7\u53d6 GetResponse\n        GetResponse getResponse = restHighLevelClient.get(getRequest, RequestOptions.DEFAULT);\n        \/\/ \u8fd4\u56de\u7ed3\u679c\n        return getResponse.getSource();\n    }\n\n    \/**\n     * \u66f4\u65b0\u4e00\u6761\u6587\u6863\n     *\/\n    @Override\n    public boolean updatePlayer(NbaPlayer nbaPlayer, String id) throws IOException {\n        \/\/ \u83b7\u53d6 UpdateRequest\n        UpdateRequest updateRequest = new UpdateRequest(NBA_INDEX, id)\n                .doc(BeanUtils.beanToMap(nbaPlayer));\n        \/\/ \u83b7\u53d6 UpdateResponse\n        UpdateResponse update = restHighLevelClient.update(updateRequest, RequestOptions.DEFAULT);\n        System.out.println(JSON.toJSONString(update));\n        return true;\n    }\n\n    \/**\n     * \u5220\u9664\u4e00\u6761\u6587\u6863\n     *\/\n    @Override\n    public boolean deletePlayer(String id) throws IOException {\n        \/\/ \u83b7\u53d6 DeleteRequest\n        DeleteRequest deleteRequest = new DeleteRequest(NBA_INDEX, id).id(id);\n        \/\/ \u83b7\u53d6 DeleteResponse\n        DeleteResponse delete = restHighLevelClient.delete(deleteRequest, RequestOptions.DEFAULT);\n        System.out.println(delete);\n        return true;\n    }\n\n    \/**\n     * \u5220\u9664\u6240\u6709\u6587\u6863\n     * \u5148\u67e5\u8be2\u6240\u6240\u6709\u5728\u8fdb\u884c\u5220\u9664\n     *\/\n    @Override\n    public boolean deleteAllPlayer() throws IOException {\n        \/\/ \u83b7\u53d6 deleteByQueryRequest\n        DeleteByQueryRequest deleteByQueryRequest = new DeleteByQueryRequest(NBA_INDEX);\n        \/\/ \u83b7\u53d6 BulkByScrollResponse\n        BulkByScrollResponse bulkByScrollResponse = restHighLevelClient.deleteByQuery(\n                deleteByQueryRequest,\n                RequestOptions.DEFAULT\n        );\n        return true;\n    }\n}<\/code><\/pre>\n<ul>\n<li>CRUD \u6d4b\u8bd5\u7c7b<\/li>\n<\/ul>\n<pre><code class=\"language-java\">import com.frame.common.entity.NbaPlayer;\nimport com.frame.elasticsearch.service.NbaPlayerService;\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport java.io.IOException;\nimport java.util.Map;\n\n@RunWith(SpringRunner.class)\n@SpringBootTest\npublic class NbaPlayerServiceImplTest {\n\n    @Autowired\n    NbaPlayerService nbaPlayerService;\n\n    @Test\n    public void addPlayer() throws IOException {\n        NbaPlayer nbaPlayer = new NbaPlayer()\n                .setId(999)\n                .setDisplayName(&quot;\u59da\u660e&quot;);\n        boolean result = nbaPlayerService.addPlayer(nbaPlayer, &quot;999&quot;);\n    }\n\n    @Test\n    public void getPlayer() throws IOException {\n        Map&lt;String, Object&gt; player = nbaPlayerService.getPlayer(&quot;999&quot;);\n        System.out.println(player);\n    }\n\n    @Test\n    public void updatePlayer() throws IOException {\n        NbaPlayer nbaPlayer = new NbaPlayer()\n                .setId(999)\n                .setDisplayName(&quot;\u6613\u5efa\u8054&quot;);\n        boolean result = nbaPlayerService.updatePlayer(nbaPlayer, &quot;999&quot;);\n    }\n\n    @Test\n    public void deletePlayer() throws IOException {\n        boolean result = nbaPlayerService.deletePlayer(&quot;999&quot;);\n    }\n\n    @Test\n    public void deleteAllPlayer() throws IOException {\n        boolean result = nbaPlayerService.deleteAllPlayer();\n    }\n}<\/code><\/pre>\n<h2>\u63a5\u53e3\u5f00\u53d1<\/h2>\n<ul>\n<li>Result\u7ed3\u679c\u96c6Vo<\/li>\n<\/ul>\n<pre><code class=\"language-java\">import com.frame.common.enums.ResultEnum;\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\n\/**\n * \u7ed3\u679c\u5c01\u88c5Vo\n *\/\n@Data\n@AllArgsConstructor\npublic class Result&lt;T&gt; {\n\n    private Integer code;\n    private String msg;\n    private T data;\n\n    public static &lt;T&gt; Result success() {\n        return success(null);\n    }\n\n    public static &lt;T&gt; Result success(T data) {\n        return success(ResultEnum.SUCCESS.getCode(), data);\n    }\n\n    public static &lt;T&gt; Result success(Integer code, T data) {\n        return success(code, ResultEnum.SUCCESS.getMsg(), data);\n    }\n\n    public static &lt;T&gt; Result success(String msg, T data) {\n        return success(ResultEnum.SUCCESS.getCode(), msg, data);\n    }\n\n    public static &lt;T&gt; Result success(Integer code, String msg, T data) {\n        return new Result&lt;T&gt;(code, msg, data);\n    }\n\n    public static &lt;T&gt; Result fail() {\n        return fail(ResultEnum.FAIL.getCode());\n    }\n\n    public static &lt;T&gt; Result fail(Integer code) {\n        return fail(code, ResultEnum.FAIL.getMsg());\n    }\n\n    public static &lt;T&gt; Result fail(String msg) {\n        return fail(ResultEnum.FAIL.getCode(), msg);\n    }\n\n    public static &lt;T&gt; Result fail(Integer code, String msg) {\n        return success(code, msg, null);\n    }\n}<\/code><\/pre>\n<ul>\n<li>\u7ed3\u679c\u96c6\u5bf9\u5e94\u7684\u679a\u4e3e<\/li>\n<\/ul>\n<pre><code class=\"language-java\">import lombok.AllArgsConstructor;\nimport lombok.Getter;\n\n\/**\n * Result\u7ed3\u679c\u96c6\u679a\u4e3e\u7c7b\n *\/\n@Getter\n@AllArgsConstructor\npublic enum ResultEnum {\n\n    SUCCESS(200, &quot;\u64cd\u4f5c\u6210\u529f&quot;),\n    FAIL(400,&quot;\u64cd\u4f5c\u5931\u8d25&quot;)\n    ;\n    private Integer code;\n    private String msg;\n}<\/code><\/pre>\n<h3>\u5c06\u6570\u636e\u5e93\u6570\u636e\u5bfc\u5165\u5230 ElasticSearch<\/h3>\n<ul>\n<li>Controller\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u4ecemysql\u5bfc\u5165\u6570\u636e\u5230es\n *\/\n@GetMapping(&quot;\/import&quot;)\npublic Result importAllPlayer() {\n    try {\n        nbaPlayerService.importAllPlayer();\n        return Result.success(&quot;\u6570\u636e\u5bfc\u5165\u6210\u529f&quot;);\n    } catch (IOException e) {\n        log.error(&quot;ElasticSearch\u5bfc\u5165\u6570\u636e\u5931\u8d25&quot;);\n        e.printStackTrace();\n        return Result.fail(&quot;ElasticSearch\u5bfc\u5165\u6570\u636e\u5931\u8d25&quot;);\n    }\n}<\/code><\/pre>\n<ul>\n<li>Service\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u4ecemysql\u5bfc\u5165\u6570\u636e\u5230es\n *\/\n@Override\n@Transactional\npublic boolean importAllPlayer() throws IOException {\n    \/\/ \u67e5\u8be2\u6240\u6709\u6570\u636e\uff0c\u8fd9\u91cc\u4f7f\u7528MybatisPlus\u4e0d\u4f5c\u89e3\u91ca\n    List&lt;NbaPlayer&gt; nbaPlayers = list();\n    for (NbaPlayer e : nbaPlayers) {\n        \/\/ \u6b64\u5904\u8c03\u7528\u7684\u589e\u52a0\u6587\u6863\u65b9\u6cd5\n        addPlayer(e, String.valueOf(e.getId()));\n    }\n    return true;\n}<\/code><\/pre>\n<h3>\u901a\u8fc7\u59d3\u540d\u67e5\u627e\u7403\u5458<\/h3>\n<ul>\n<li>Controller\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u901a\u8fc7\u59d3\u540d\u67e5\u627e\u7403\u5458\n *\/\n@GetMapping(&quot;\/searchMatch&quot;)\npublic Result searchMatch(@RequestParam(&quot;key&quot;) String key,\n                          @RequestParam(&quot;val&quot;) String val,\n                          @RequestParam(value = &quot;page&quot;, required = false, defaultValue = &quot;0&quot;) Integer page,\n                          @RequestParam(value = &quot;limit&quot;, required = false, defaultValue = &quot;10&quot;) Integer limit) {\n    List&lt;NbaPlayer&gt; nbaPlayers = null;\n    try {\n        nbaPlayers = nbaPlayerService.searchTerm(key, val, page, limit);\n    } catch (IOException e) {\n        log.error(&quot;searchMatch\u5931\u8d25,\u53c2\u6570[key={}]][val={}]]&quot;, key, val);\n        e.printStackTrace();\n    }\n    return Result.success(nbaPlayers);\n}<\/code><\/pre>\n<ul>\n<li>service\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u901a\u8fc7\u59d3\u540d\u67e5\u627e\u7403\u5458\n *\/\n@Override\npublic List&lt;NbaPlayer&gt; searchMatch(String key, String val, Integer page, Integer limit) throws IOException {\n    \/\/ \u83b7\u53d6 SearchRequest\n    SearchRequest searchRequest = new SearchRequest(NBA_INDEX);\n    \/\/ \u521b\u5efa SearchSourceBuilder \u7528\u4e8e\u67e5\u8be2\u8bed\u53e5\n    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();\n    searchSourceBuilder\n            \/\/ \u67e5\u8be2 \u901a\u8fc7match\u67e5\u8be2 key \u5b57\u6bb5\u540d\u79f0 val \u5b57\u6bb5\u503c\n            .query(QueryBuilders.termQuery(key, val))\n            \/\/ \u8d77\u59cb\u9875\n            .from(page)\n            \/\/ \u663e\u793a\u6761\u6570\n            .size(limit);\n    \/\/ \u8bbe\u7f6e \u8bf7\u6c42\u6e90 \u7406\u89e3\u4e3a\u8bbe\u7f6e\u67e5\u8be2\u8bed\u53e5\n    searchRequest.source(searchSourceBuilder);\n    \/\/ \u83b7\u53d6 SearchResponse \u67e5\u8be2\u6570\u636e\n    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);\n    \/\/ \u83b7\u53d6\u78b0\u649e\u4e4b\u540e\u7684\u7ed3\u679c (\u56fa\u5b9a\u5199\u6cd5)\n    SearchHit[] hits = searchResponse.getHits().getHits();\n    \/\/ \u8fdb\u884c\u5bf9\u8c61\u8f6c\u6362\u5e76\u8fd4\u56de\n    return Stream.of(hits)\n            .map(e -&gt; JSON.parseObject(e.getSourceAsString(), NbaPlayer.class))\n            .collect(Collectors.toList());\n}<\/code><\/pre>\n<h3>\u901a\u8fc7\u56fd\u5bb6\u6216\u8005\u7403\u961f\u67e5\u8be2\u7403\u5458<\/h3>\n<ul>\n<li>Controller\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u901a\u8fc7\u56fd\u5bb6\u6216\u8005\u7403\u961f\u67e5\u8be2\u7403\u5458\n *\/\n@GetMapping(&quot;\/searchTerm&quot;)\npublic Result searchTerm(@RequestParam(value = &quot;country&quot;, required = false) String country,\n                         @RequestParam(value = &quot;teamName&quot;, required = false) String teamName,\n                         @RequestParam(value = &quot;page&quot;, required = false, defaultValue = &quot;0&quot;) Integer page,\n                         @RequestParam(value = &quot;limit&quot;, required = false, defaultValue = &quot;10&quot;) Integer limit) {\n    List&lt;NbaPlayer&gt; nbaPlayers = null;\n    try {\n        \/\/ \u8def\u7531\u9009\u62e9\u56fd\u5bb6 \u6216\u8005 \u7403\u961f\n        if (StringUtils.isNotBlank(country)) {\n            nbaPlayers = nbaPlayerService.searchTerm(&quot;country&quot;, country, page, limit);\n        } else {\n            nbaPlayers = nbaPlayerService.searchTerm(&quot;teamName&quot;, teamName, page, limit);\n        }\n    } catch (IOException e) {\n        log.error(&quot;searchTerm\u5931\u8d25,\u53c2\u6570[country={}]][teamName={}]]&quot;, country, teamName);\n        e.printStackTrace();\n    }\n    return CollectionUtils.isNotEmpty(nbaPlayers) ? Result.success(nbaPlayers) : Result.success();\n}<\/code><\/pre>\n<ul>\n<li>Service\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u901a\u8fc7\u56fd\u5bb6\u6216\u8005\u7403\u961f\u67e5\u8be2\u7403\u5458\n *\/\n@Override\npublic List&lt;NbaPlayer&gt; searchTerm(String key, String val, Integer page, Integer limit) throws IOException {\n    \/\/ \u83b7\u53d6 SearchRequest\n    SearchRequest searchRequest = new SearchRequest(NBA_INDEX);\n    \/\/ \u521b\u5efa SearchSourceBuilder \u7528\u4e8e\u67e5\u8be2\u8bed\u53e5\n    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();\n    searchSourceBuilder\n            \/\/ \u67e5\u8be2 \u901a\u8fc7match\u67e5\u8be2 key \u5b57\u6bb5\u540d\u79f0 val \u5b57\u6bb5\u503c\n            .query(QueryBuilders.termQuery(key, val))\n            \/\/ \u8d77\u59cb\u9875\n            .from(page)\n            \/\/ \u663e\u793a\u6761\u6570\n            .size(limit);\n    \/\/ \u8bbe\u7f6e \u8bf7\u6c42\u6e90 \u7406\u89e3\u4e3a\u8bbe\u7f6e\u67e5\u8be2\u8bed\u53e5\n    searchRequest.source(searchSourceBuilder);\n    \/\/ \u83b7\u53d6 SearchResponse \u67e5\u8be2\u6570\u636e\n    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);\n    \/\/ \u83b7\u53d6\u78b0\u649e\u4e4b\u540e\u7684\u7ed3\u679c (\u56fa\u5b9a\u5199\u6cd5)\n    SearchHit[] hits = searchResponse.getHits().getHits();\n    \/\/ \u8fdb\u884c\u5bf9\u8c61\u8f6c\u6362\u5e76\u8fd4\u56de\n    return Stream.of(hits)\n            .map(e -&gt; JSON.parseObject(e.getSourceAsString(), NbaPlayer.class))\n            .collect(Collectors.toList());\n}<\/code><\/pre>\n<h3>\u901a\u8fc7\u59d3\u540d\u5b57\u6bcd\u67e5\u627e\u7403\u5458<\/h3>\n<ul>\n<li>Controller\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u901a\u8fc7\u59d3\u540d\u5b57\u6bcd\u67e5\u627e\u7403\u5458\n *\/\n@GetMapping(&quot;\/searchPrefix&quot;)\npublic Result searchPrefix(@RequestParam(value = &quot;prefix&quot;, required = false, defaultValue = &quot;A&quot;) String prefix,\n                           @RequestParam(value = &quot;page&quot;, required = false, defaultValue = &quot;0&quot;) Integer page,\n\n                           @RequestParam(value = &quot;limit&quot;, required = false, defaultValue = &quot;10&quot;) Integer limit) {\n    List&lt;NbaPlayer&gt; nbaPlayers = null;\n    try {\n        nbaPlayers = nbaPlayerService.searchPrefix(prefix, page, limit);\n    } catch (IOException e) {\n        log.error(&quot;searchPrefix\u5931\u8d25,\u53c2\u6570[prefix={}]]&quot;, prefix);\n        e.printStackTrace();\n    }\n    return CollectionUtils.isNotEmpty(nbaPlayers) ? Result.success(nbaPlayers) : Result.success();\n}<\/code><\/pre>\n<ul>\n<li>Service\u5c42<\/li>\n<\/ul>\n<pre><code class=\"language-java\">\/**\n * \u901a\u8fc7\u59d3\u540d\u5b57\u6bcd\u67e5\u627e\u7403\u5458\n *\/\n@Override\npublic List&lt;NbaPlayer&gt; searchPrefix(String prefix, Integer page, Integer limit) throws IOException {\n    \/\/ \u83b7\u53d6 SearchRequest\n    SearchRequest searchRequest = new SearchRequest(NBA_INDEX);\n    \/\/ \u521b\u5efa SearchSourceBuilder \u7528\u4e8e\u67e5\u8be2\u8bed\u53e5\n    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();\n    searchSourceBuilder\n            \/\/ \u67e5\u8be2 \u901a\u8fc7prefix\u67e5\u8be2 displayNameEn.keyword \u540d\u5b57\u5b57\u6bb5 prefix \u524d\u7f00\u5b57\u6bcd\n            .query(QueryBuilders.prefixQuery(&quot;displayNameEn.keyword&quot;, prefix))\n            \/\/ \u8d77\u59cb\u9875\n            .from(page)\n            \/\/ \u663e\u793a\u6761\u6570\n            .size(limit);\n    \/\/ \u8bbe\u7f6e \u8bf7\u6c42\u6e90 \u7406\u89e3\u4e3a\u8bbe\u7f6e\u67e5\u8be2\u8bed\u53e5\n    searchRequest.source(searchSourceBuilder);\n    \/\/ \u83b7\u53d6 SearchResponse \u67e5\u8be2\u6570\u636e\n    SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);\n    \/\/ \u83b7\u53d6\u78b0\u649e\u4e4b\u540e\u7684\u7ed3\u679c (\u56fa\u5b9a\u5199\u6cd5)\n    SearchHit[] hits = searchResponse.getHits().getHits();\n    \/\/ \u8fdb\u884c\u5bf9\u8c61\u8f6c\u6362\u5e76\u8fd4\u56de\n    return Stream.of(hits)\n            .map(e -&gt; JSON.parseObject(e.getSourceAsString(), NbaPlayer.class))\n            .collect(Collectors.toList());\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5b98\u65b9\u7f51\u7ad9\uff1ahttps:\/\/china.nba.com\/playerindex\/ \u9879\u76ee\u642d\u5efa Spring Boo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[301],"tags":[],"class_list":["post-1109","post","type-post","status-publish","format-standard","hentry","category-elasticsearch"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1109"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1109\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}