Spring Boot集成Elasticsearch查询数据(TransportClient)

下边就开始elasticsearch的查询操作,用的是TransportClient客户端。

elasticsearch是java的开发的对罐子是强依赖,要注意版本依赖

<dependencies>     
         <dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>transport</artifactId>
		</dependency>

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

        <dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.7</version>
		</dependency>


        <dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.33</version>
		</dependency>

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

</dependencies>

这里要注意把Spring boot中集成elasticsearch去掉,不然会自动找那个包,启动会报错。

TransportClient客户端实例配置

    @Bean
	public TransportClient getClient() throws UnknownHostException{
		System.out.println("---------------init es client");
		InetSocketTransportAddress node = new InetSocketTransportAddress(
				InetAddress.getByName(serverHost),9300    //ip
				); 
		Settings setttings = Settings.builder()
				.put("client.transport.sniff", true)
				.put("cluster.name", clusterName).build();  //集群名字
		
		TransportClient client = new PreBuiltTransportClient(setttings);
		client.addTransportAddress(node);
		return client;
	}

控制器层,因为是个演示所以不分层了,直接在控制器层返回

 */
@RestController
@RequestMapping("/book")
public class AccountController {

    @Autowired
    TransportClient client;

    @RequestMapping(value = "/novel/get", method= RequestMethod.GET)
    @ResponseBody
    public ResponseEntity findById(@RequestParam(name = "id") String id){
      
        GetResponse result = client.prepareGet("account_info","detail",id).get();
        if(!result.isExists()){
            return new ResponseEntity(HttpStatus.NOT_FOUND);
        }
        return new ResponseEntity(result.getSource(), HttpStatus.OK);
    }

    @RequestMapping(value = "/novel/list", method= RequestMethod.GET)
    @ResponseBody
    public JSONObject findListAll(
         @RequestParam(name = "from",defaultValue = "0") Integer offset
        ,@RequestParam(name = "size",defaultValue = "50") Integer limit
    )  {
        SearchRequestBuilder builder = Client.prepareSearch("Index")
                .setTypes("type")
                .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
                .setFrom(from)
                .setSize(size);
        System.out.println(builder);
        SearchResponse response = builder.get();
        List<Map<String,Object>> result = new ArrayList<Map<String, Object>>();
        for (SearchHit hit:response.getHits()){
            result.add(hit.getSource());
        }
        List result = null;
        try {
            result = accountService.findListAll(from,size);
        }catch (Exception e){
             return new ResponseEntity(HttpStatus.NOT_FOUND);
        }
        String string = JSON.toJSONString(result);   //多加两个json字段返回给前端
        JSONObject object = new JSONObject();
        object.put("size",result.size());
        object.put("content",string);
        return object;
    }
}

第一个方法是传入ID来找对应编号的数据,接口格式是<IP> <端口> /书/新颖/获得/?ID = 1

第二个方法是传入第几页和每页显示的条数(如果是第一页就是从= 0),格式是:<ip> <port> / book / novel / get /?from = 0&size = 10

返回后的JSON格式是

{
    ‘size’:5,
    ‘content’:[{....},{....},{....}]

}

猜你喜欢

转载自blog.csdn.net/yxm234786/article/details/81366203