Elasticsearch之自动补全案例实战

1、案例需求:

通过拼音以及汉字筛选对应的明星!

2、设置分词器以及mapping

PUT starts
{
  "settings": {
    "analysis": {
      "analyzer": {
        "start_name_analyzer":{
          "char_filter":["html_strip"],
          "tokenizer":"keyword",
          "filter":"start_name_filter"
        }
      },
      "filter": {
        "start_name_filter":{
          "type":"pinyin",
          "keep_full_pinyin":false,
          "keep_joined_full_pinyin":true,
          "keep_original": true
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "name":{
        "type": "completion",
        "analyzer": "start_name_analyzer",
        "search_analyzer": "keyword"
      }
    }
  }
}

3、批量插入数据

PUT starts/_bulk
{"index":{}}
{"name":"张学友"}
{"index":{}}
{"name":"刘德华"}
{"index":{}}
{"name":"柳岩"}
{"index":{}}
{"name":"李易峰"}
{"index":{}}
{"name":"黄晓明"}
{"index":{}}
{"name":"刘青云"}
{"index":{}}
{"name":"易中天"}
{"index":{}}
{"name":"李小璐"}
{"index":{}}
{"name":"黄家驹"}
{"index":{}}
{"name":"李思思"}
{"index":{}}
{"name":"庄媛媛"}
{"index":{}}
{"name":"刘亦菲"}

4、在kibana上测试一下效果

GET starts/_search
{
  "_source": false,
  "suggest": {
    "start_name_suggest": {
      "prefix":"柳",
      "completion":{
        "field":"name",
        "size": 10,
        "skip_duplicates": true
      }
    }
  }
}

5、在java服务端实现上面测试的自动补全案例

5.1、Springboot整合ES7.8.1已经提前整合了

5.2、创建controller类

package com.kgf.es.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.util.EntityUtils;
import org.elasticsearch.client.Request;
import org.elasticsearch.client.Response;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RequestMapping("start")
@RestController
public class StartController {


    @Resource
    private RestHighLevelClient restHighLevelClient;

    @GetMapping("autoComplete")
    public Object autoComplete(String term) throws IOException {
        Request request = new Request("GET", "starts/_search");
        request.setJsonEntity(String.format("{" +
                "  \"_source\": false," +
                "  \"suggest\": {" +
                "    \"start_name_suggest\": {" +
                "      \"prefix\":\"%s\"," +
                "      \"completion\":{" +
                "        \"field\":\"name\"," +
                "        \"size\": 10," +
                "        \"skip_duplicates\": true" +
                "      }" +
                "    }" +
                "  }" +
                "}",term));
        Response response = restHighLevelClient.getLowLevelClient().performRequest(request);
        String json = EntityUtils.toString(response.getEntity());
        JSONObject jsonObject = JSONObject.parseObject(json);
        JSONArray suggests = jsonObject.getJSONObject("suggest").getJSONArray("start_name_suggest");
        JSONArray options = suggests.getJSONObject(0).getJSONArray("options");
        List<String> list = new ArrayList<>();
        for (int i = 0; i < options.size(); i++) {
            JSONObject object = options.getJSONObject(i);
            list.add(object.getString("text"));
        }
        return list;
    }
}

6、访问测试效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值