基於 Elasticsearch 搜尋商品 連接篇

踩坑中ing , 修改為 Java high-level REST client 連接 Elasticsearch

entity

java
public class Person {
    private String personId;
    private String name;

    // 省略setter,getter

    @Override
    public String toString() {
        return "Person{" +
                "personId='" + personId + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public String getPersonId() {
        return personId;
    }

    public void setPersonId(String personId) {
        this.personId = personId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

esController

java
@Controller
@RequestMapping("/esProduct")
public class esitemConntroller {

        @Autowired
        private esitemService esProductService;

        @RequestMapping(value = "/newindex/{personId}/{name}", method = RequestMethod.GET)
        @ResponseBody
        public String newindex(@PathVariable String personId,@PathVariable String name) {
            System.out.println("Inserting a new Person with name xiaoyaook...");
            Person person = new Person();
            person.setName(name);
            //person.setPersonId(personId);
            person = esProductService.insertPerson(person);
            System.out.println("Person inserted --> " + person);
            return "Person inserted --> " + person;
        }


        @RequestMapping(value = "/updateindex/{personId}/{name}", method = RequestMethod.GET)
        @ResponseBody
        public String updateindex(@PathVariable String personId,@PathVariable String name) {
            System.out.println("Changing name to `XY`...");
            Person person = new Person();
            Person personFromDB = esProductService.getPersonById(personId);
            person.setName(name);
            person.setPersonId(personFromDB.getPersonId());
            esProductService.updatePersonById(personId, person);


            return "Person updated  --> " + person;
        }


        @RequestMapping(value = "/getindex/{id}", method = RequestMethod.GET)
        @ResponseBody
        public String getindex(@PathVariable String id) {
            System.out.println("Getting XY...");
            Person personFromDB = esProductService.getPersonById(id);
            System.out.println("Person from DB  --> " + personFromDB);
            return "Person from DB  --> " + personFromDB;
        }

        @RequestMapping(value = "/deleteindex/{personId}", method = RequestMethod.GET)
        @ResponseBody
        public String deleteindex(@PathVariable String personId) {

            System.out.println("Deleting XY...");
            //Person personFromDB = esProductService.getPersonById(id);
            esProductService.deletePersonById(personId);
//          System.out.println("Person from DB  --> " + personFromDB);
            return "Person Deleted";
        }

esService

java
/**
 * 
 * @author x2132
 * 商品搜尋管理 service
 * 2020/5/16
 *
 */

public interface esitemService {
    /**
     * 新增到ES
     */
    Person insertPerson(Person person);

    /**
     * 根據 id 取得商品
     */
    Person getPersonById(String id);

    /**
     * 根據id 更新商品
     * @return 
     */
    Person  updatePersonById(String id, Person person);

    /**
     * 根據id 刪除商品
     */
    void deletePersonById(String id);

}

esitemServiceimpl

java
@Service

public final class esitemServiceimpl implements esitemService {

    private static final String HOST = "192.168.99.100";
    // Elasticsearch查询服务器使用9200端口,我们可以通过RESTful API直接查询数据库。
    private static final int PORT_ONE = 9200;
    // REST服务器使用9201端口,外部客户端可以使用它来连接和执行操作。
    private static final int PORT_TWO = 9201;
    // 通信方式
    private static final String SCHEME = "http";
    // 高级客户端实例
    private static RestHighLevelClient restHighLevelClient;
    // Jackson 的转换类
    private static ObjectMapper objectMapper = new ObjectMapper();
    // 索引名称
    private static final String INDEX = "persondata";
    // 索引类型
    private static final String TYPE = "person";

    public esitemServiceimpl() {
        super();
        makeConnection();

    }
    private static synchronized RestHighLevelClient makeConnection() {

        if(restHighLevelClient == null) {
            restHighLevelClient = new RestHighLevelClient(
                    RestClient.builder(
                            new HttpHost(HOST, PORT_ONE, SCHEME),
                            new HttpHost(HOST, PORT_TWO, SCHEME)));
        }
        System.out.println("RestHighLevelClient initialization successful!"); 
        return restHighLevelClient;
    }
    private static synchronized void closeConnection() throws IOException {
        restHighLevelClient.close();
        restHighLevelClient = null;
    } 
    @Override
    public  Person insertPerson(Person person){

        person.setPersonId(UUID.randomUUID().toString());
        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("personId", person.getPersonId());
        dataMap.put("name", person.getName());
        IndexRequest indexRequest = new IndexRequest(INDEX, TYPE, person.getPersonId())
                .source(dataMap);
        try {
            IndexResponse response = restHighLevelClient.index(indexRequest,  RequestOptions.DEFAULT);
        } catch(ElasticsearchException e) {
            e.getDetailedMessage();
        } catch (java.io.IOException ex){
            ex.getLocalizedMessage();
        }
        return person;
    }
    @Override
    public   Person getPersonById(String id){
        GetRequest getPersonRequest = new GetRequest(INDEX, TYPE, id);
        GetResponse getResponse = null;
        try {
            getResponse = restHighLevelClient.get(getPersonRequest, RequestOptions.DEFAULT);
        } catch (java.io.IOException e){
            e.getLocalizedMessage();
        }
        return getResponse != null ?
                objectMapper.convertValue(getResponse.getSourceAsMap(), Person.class) : null;
    }
    @Override
    public Person updatePersonById(String id, Person person){
        UpdateRequest updateRequest = new UpdateRequest(INDEX, TYPE, id)
                .fetchSource(true);    // 更新后获取对象
        try {
            String personJson = objectMapper.writeValueAsString(person);
            updateRequest.doc(personJson, XContentType.JSON);
            UpdateResponse updateResponse = restHighLevelClient.update(updateRequest,  RequestOptions.DEFAULT);
            return objectMapper.convertValue(updateResponse.getGetResult().sourceAsMap(), Person.class);
        }catch (JsonProcessingException e){
            e.getMessage();
        } catch (java.io.IOException e){
            e.getLocalizedMessage();
        }
        System.out.println("Unable to update person");
        return null;
    }
    @Override
    public void deletePersonById(String id) {
        DeleteRequest deleteRequest = new DeleteRequest(INDEX, TYPE, id);
        try {
            DeleteResponse deleteResponse = restHighLevelClient.delete(deleteRequest,  RequestOptions.DEFAULT);
        } catch (java.io.IOException e){
            e.getLocalizedMessage();
        }
    }


}

newindex

預設 person 在 esitemServiceimpl 產生uuid 編號 http://localhost:8080/esProduct/newindex/1/test

updateindex

http://localhost:8080/esProduct/updateindex/032d4288-a7bd-44f0-a875-b89ea6cda80c/hah214 異動版本號會更新

getindex

http://localhost:8080/esProduct/getindex/6929b00d-c7f0-46c4-b0d8-ab6b9f610456

deleteindex

http://localhost:8080/esProduct/deleteindex/032d4288-a7bd-44f0-a875-b89ea6cda80c 刪除032d4288-a7bd-44f0-a875-b89ea6cda80c

後續會補足 全文搜尋 匹配搜尋 等等 還有搭配我們的 kibana 顯示搜尋分析 最後就是透過我們的 logstash 同步mysql或者是 kafaka 同步我們的數據到我們的 es