> Java > java지도 시간 > 본문

SpringBoot+Elasticsearch가 데이터 검색을 구현하는 방법

WBOY
풀어 주다: 2023-05-12 21:04:04
앞으로
1217명이 탐색했습니다.

    1. 소개

    SpringBoot는 네 가지 주요 방법으로 연결됩니다.

    • 방법 1: 기본 계층은 Elastic Transport Client를 통해 TCP 프로토콜을 기반으로 합니다. 전송 모듈 및 원격 ES 서비스 End-to-end 통신은 V7.0부터 공식적으로 사용이 권장되지 않으며 V8.0부터 공식적으로 제거됩니다.

    • 방법 2: Elastic Java Low Level Rest Client를 통해 ES 서버에 연결합니다. 기본 계층은 HTTP 프로토콜 기반의 Restful API를 통해 원격 ES 서버와 통신합니다. 이전 기사에서 소개한 API 작업 로직과 유사합니다.

    • 방법 3: Elastic Java High Level Rest Client를 통해 es 서버에 연결합니다. 하단 레이어는 Elastic Java Low Level Rest Client를 기반으로 캡슐화되어 고급 API와 Elastic Transport Client 인터페이스 및 매개변수를 제공합니다. 일관성을 유지하세요. 공식적으로 권장되는 es 클라이언트입니다.

    • 방법 4: JestClient 클라이언트를 통해 es 서버에 연결합니다. 이는 HTTP 프로토콜을 기반으로 오픈 소스 커뮤니티에서 개발한 es 클라이언트입니다. 공식적으로는 인터페이스와 코드 디자인이 JestClient보다 더 간단하고 합리적이라고 주장합니다. ES에서 공식적으로 제공하는 Rest 클라이언트입니다. 사용하기 쉽고 특정 ES 서버 버전과 호환되지만 업데이트 속도가 그리 빠르지 않습니다. 현재 ES 버전은 V7.9로 출시되었지만 JestClient는 V1.0~V6만 지원합니다. .X 버전의 ES.

    모두가 주목해야 할 또 한 가지가 바로 버전 번호의 호환성입니다!

    개발 과정에서 모든 사람은 클라이언트와 서버의 버전 번호에 특별한 주의를 기울여야 하며 이를 최대한 일관되게 유지해야 합니다. 예를 들어 서버의 버전 번호는 6.8.2이고 그 다음 버전은 다음과 같습니다. es에 연결된 클라이언트의 번호는 6.8.2와 동일해야 하며, 프로젝트상의 이유로 일관성이 없더라도 클라이언트 버전은 6.0.0에서 6.8.2 사이여야 하며 서버 버전 번호를 초과하지 않아야 합니다. 클라이언트가 정상적으로 작동할 수 있도록 그렇지 않으면 예상치 못한 문제가 많이 발생할 수 있습니다. 클라이언트가 7.0.4 버전인 경우 이 시점에서 프로그램이 다양한 오류를 보고하고 심지어 사용할 수 없게 됩니다.

    이러는 이유는 무엇입니까? 주된 이유는 es 서버의 상위 버전이 하위 버전과 호환되지 않기 때문입니다. es6은 es7의 일부 API 요청 매개변수 구조와 매우 다르기 때문에 클라이언트와 서버 버전 번호를 최대한 일관되게 유지해야 합니다.

    말도 안되는 소리는 그만하고 바로 코드로 넘어가자!

    2. 코드 연습

    본 글에서 사용된 SpringBoot 버전은 2.1.0.RELEASE이고, 서버 es의 버전은 6.8.2이며, 클라이언트 사용 Elastic Java High Level Rest Client의 공식 권장 버전 번호는 6.4.2이며, 이는 SpringBoot 버전과 편리하게 호환됩니다.

    2.1. 종속성 가져오기

    <!--elasticsearch-->
    <dependency>
        <groupId>org.elasticsearch</groupId>
        <artifactId>elasticsearch</artifactId>
        <version>6.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-client</artifactId>
        <version>6.4.2</version>
    </dependency>
    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>6.4.2</version>
    </dependency>
    로그인 후 복사

    2.2. 환경 변수 구성

    application.properties 전역 구성 파일에서 elasticsearch 사용자 지정 환경 변수를 구성합니다.

    elasticsearch.scheme=http
    elasticsearch.address=127.0.0.1:9200
    elasticsearch.userName=
    elasticsearch.userPwd=
    elasticsearch.socketTimeout=5000
    elasticsearch.connectTimeout=5000
    elasticsearch.connectionRequestTimeout=5000
    로그인 후 복사

    2.3 Elasticsearch의 config 클래스를 생성합니다

    @Configuration
    public class ElasticsearchConfiguration {
    
        private static final Logger log = LoggerFactory.getLogger(ElasticsearchConfiguration.class);
    
    
        private static final int ADDRESS_LENGTH = 2;
    
        @Value("${elasticsearch.scheme:http}")
        private String scheme;
    
        @Value("${elasticsearch.address}")
        private String address;
    
        @Value("${elasticsearch.userName}")
        private String userName;
    
        @Value("${elasticsearch.userPwd}")
        private String userPwd;
    
        @Value("${elasticsearch.socketTimeout:5000}")
        private Integer socketTimeout;
    
        @Value("${elasticsearch.connectTimeout:5000}")
        private Integer connectTimeout;
    
        @Value("${elasticsearch.connectionRequestTimeout:5000}")
        private Integer connectionRequestTimeout;
    
        /**
         * 初始化客户端
         * @return
         */
        @Bean(name = "restHighLevelClient")
        public RestHighLevelClient restClientBuilder() {
            HttpHost[] hosts = Arrays.stream(address.split(","))
                    .map(this::buildHttpHost)
                    .filter(Objects::nonNull)
                    .toArray(HttpHost[]::new);
            RestClientBuilder restClientBuilder = RestClient.builder(hosts);
            // 异步参数配置
            restClientBuilder.setHttpClientConfigCallback(httpClientBuilder -> {
                httpClientBuilder.setDefaultCredentialsProvider(buildCredentialsProvider());
                return httpClientBuilder;
            });
    
            // 异步连接延时配置
            restClientBuilder.setRequestConfigCallback(requestConfigBuilder -> {
                requestConfigBuilder.setConnectionRequestTimeout(connectionRequestTimeout);
                requestConfigBuilder.setSocketTimeout(socketTimeout);
                requestConfigBuilder.setConnectTimeout(connectTimeout);
                return requestConfigBuilder;
            });
    
            return new RestHighLevelClient(restClientBuilder);
        }
    
    
        /**
         * 根据配置创建HttpHost
         * @param s
         * @return
         */
        private HttpHost buildHttpHost(String s) {
            String[] address = s.split(":");
            if (address.length == ADDRESS_LENGTH) {
                String ip = address[0];
                int port = Integer.parseInt(address[1]);
                return new HttpHost(ip, port, scheme);
            } else {
                return null;
            }
        }
    
        /**
         * 构建认证服务
         * @return
         */
        private CredentialsProvider buildCredentialsProvider(){
            final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
            credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials(userName,
                    userPwd));
            return credentialsProvider;
        }
    }
    로그인 후 복사

    이 시점에서 클라이언트 구성이 완료되고, 프로젝트가 시작되면 자동으로 Spring의 ioc 컨테이너에 주입됩니다.

    2.4.인덱스 관리

    es 가장 중요한 것은 클라이언트 측에서 인덱스 라이브러리를 만드는 방법입니다.

    색인 생성

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 创建索引(简单模式)
         * @throws IOException
         */
        @Test
        public void createIndex() throws IOException {
            CreateIndexRequest request = new CreateIndexRequest("cs_index");
            CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    
        /**
         * 创建索引(复杂模式)
         * 可以直接把对应的文档结构也一并初始化
         * @throws IOException
         */
        @Test
        public void createIndexComplete() throws IOException {
            CreateIndexRequest request = new CreateIndexRequest();
            //索引名称
            request.index("cs_index");
            //索引配置
            Settings settings = Settings.builder()
                    .put("index.number_of_shards", 3)
                    .put("index.number_of_replicas", 1)
                    .build();
            request.settings(settings);
    
            //映射结构字段
            Map<String, Object> properties = new HashMap();
            properties.put("id", ImmutableBiMap.of("type", "text"));
            properties.put("name", ImmutableBiMap.of("type", "text"));
            properties.put("sex", ImmutableBiMap.of("type", "text"));
            properties.put("age", ImmutableBiMap.of("type", "long"));
            properties.put("city", ImmutableBiMap.of("type", "text"));
            properties.put("createTime", ImmutableBiMap.of("type", "long"));
            Map<String, Object> mapping = new HashMap<>();
            mapping.put("properties", properties);
            //添加一个默认类型
            System.out.println(JSON.toJSONString(request));
            request.mapping("_doc",mapping);
            CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    }
    로그인 후 복사

    색인 삭제

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 删除索引
         * @throws IOException
         */
        @Test
        public void deleteIndex() throws IOException {
            DeleteIndexRequest request = new DeleteIndexRequest("cs_index1");
            AcknowledgedResponse response = client.indices().delete(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    
    }
    로그인 후 복사

    색인 쿼리

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 查询索引
         * @throws IOException
         */
        @Test
        public void getIndex() throws IOException {
            // 创建请求
            GetIndexRequest request = new GetIndexRequest();
            request.indices("cs_index");
            // 执行请求,获取响应
            GetIndexResponse response = client.indices().get(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    
    }
    로그인 후 복사

    색인 존재 여부 쿼리

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 检查索引是否存在
         * @throws IOException
         */
        @Test
        public void exists() throws IOException {
            // 创建请求
            GetIndexRequest request = new GetIndexRequest();
            request.indices("cs_index");
            // 执行请求,获取响应
            boolean response = client.indices().exists(request, RequestOptions.DEFAULT);
            System.out.println(response);
        }
    
    }
    로그인 후 복사

    모든 인덱스 이름 쿼리

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 查询所有的索引名称
         * @throws IOException
         */
        @Test
        public void getAllIndices() throws IOException {
            GetAliasesRequest request = new GetAliasesRequest();
            GetAliasesResponse response =  client.indices().getAlias(request,RequestOptions.DEFAULT);
            Map<String, Set<AliasMetaData>> map = response.getAliases();
            Set<String> indices = map.keySet();
            for (String key : indices) {
                System.out.println(key);
            }
        }
    
    }
    로그인 후 복사

    쿼리 인덱스 매핑 필드

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 查询索引映射字段
         * @throws IOException
         */
        @Test
        public void getMapping() throws IOException {
            GetMappingsRequest request = new GetMappingsRequest();
            request.indices("cs_index");
            request.types("_doc");
            GetMappingsResponse response = client.indices().getMapping(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    
    
    }
    로그인 후 복사

    인덱스 매핑 필드 추가

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class IndexJunit {
    
    
        @Autowired
        private RestHighLevelClient client;
    
        /**
         * 添加索引映射字段
         * @throws IOException
         */
        @Test
        public void addMapping() throws IOException {
            PutMappingRequest request = new PutMappingRequest();
            request.indices("cs_index");
            request.type("_doc");
    
            //添加字段
            Map<String, Object> properties = new HashMap();
            properties.put("accountName", ImmutableBiMap.of("type", "keyword"));
            Map<String, Object> mapping = new HashMap<>();
            mapping.put("properties", properties);
            request.source(mapping);
            PutMappingResponse response = client.indices().putMapping(request, RequestOptions.DEFAULT);
            System.out.println(response.isAcknowledged());
        }
    
    
    }
    로그인 후 복사

    2.5.문서 관리

    문서란 데이터 쿼리를 용이하게 하기 위해 인덱스에 데이터를 추가하는 것입니다.

    문서 추가

    ublic class UserDocument {
    
        private String id;
        private String name;
        private String sex;
        private Integer age;
        private String city;
        private Date createTime;
    
        //省略get、set...
    }
    로그인 후 복사
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class DocJunit {
    
        @Autowired
        private RestHighLevelClient client;
    
    
        /**
         * 添加文档
         * @throws IOException
         */
        @Test
        public void addDocument() throws IOException {
            // 创建对象
            UserDocument user = new UserDocument();
            user.setId("1");
            user.setName("里斯");
            user.setCity("武汉");
            user.setSex("男");
            user.setAge(20);
            user.setCreateTime(new Date());
    
            // 创建索引,即获取索引
            IndexRequest request = new IndexRequest();
            // 外层参数
            request.id("1");
            request.index("cs_index");
            request.type("_doc");
            request.timeout(TimeValue.timeValueSeconds(1));
            // 存入对象
            request.source(JSON.toJSONString(user), XContentType.JSON);
            // 发送请求
            System.out.println(request.toString());
            IndexResponse response = client.index(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    
    }
    로그인 후 복사

    문서 업데이트

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class DocJunit {
    
        @Autowired
        private RestHighLevelClient client;
    
    
        /**
         * 更新文档(按需修改)
         * @throws IOException
         */
        @Test
        public void updateDocument() throws IOException {
            // 创建对象
            UserDocument user = new UserDocument();
            user.setId("2");
            user.setName("程咬金");
            user.setCreateTime(new Date());
            // 创建索引,即获取索引
            UpdateRequest request = new UpdateRequest();
            // 外层参数
            request.id("2");
            request.index("cs_index");
            request.type("_doc");
            request.timeout(TimeValue.timeValueSeconds(1));
            // 存入对象
            request.doc(JSON.toJSONString(user), XContentType.JSON);
            // 发送请求
            System.out.println(request.toString());
            UpdateResponse response = client.update(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    
    
    }
    로그인 후 복사

    문서 삭제

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class DocJunit {
    
        @Autowired
        private RestHighLevelClient client;
    
    
        /**
         * 删除文档
         * @throws IOException
         */
        @Test
        public void deleteDocument() throws IOException {
            // 创建索引,即获取索引
            DeleteRequest request = new DeleteRequest();
            // 外层参数
            request.id("1");
            request.index("cs_index");
            request.type("_doc");
            request.timeout(TimeValue.timeValueSeconds(1));
            // 发送请求
            System.out.println(request.toString());
            DeleteResponse response = client.delete(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    
    
    }
    로그인 후 복사

    문서 존재 여부 조회

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class DocJunit {
    
        @Autowired
        private RestHighLevelClient client;
    
    
        /**
         * 查询文档是不是存在
         * @throws IOException
         */
        @Test
        public void exists() throws IOException {
            // 创建索引,即获取索引
            GetRequest request = new GetRequest();
            // 外层参数
            request.id("3");
            request.index("cs_index");
            request.type("_doc");
            // 发送请求
            System.out.println(request.toString());
            boolean response = client.exists(request, RequestOptions.DEFAULT);
            System.out.println(response);
        }
    }
    로그인 후 복사

    지정 문서 ID로 조회

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest(classes = ElasticSearchApplication.class)
    public class DocJunit {
    
        @Autowired
        private RestHighLevelClient client;
    
    
        /**
         * 通过ID,查询指定文档
         * @throws IOException
         */
        @Test
        public void getById() throws IOException {
            // 创建索引,即获取索引
            GetRequest request = new GetRequest();
            // 外层参数
            request.id("1");
            request.index("cs_index");
            request.type("_doc");
            // 发送请求
            System.out.println(request.toString());
            GetResponse response = client.get(request, RequestOptions.DEFAULT);
            System.out.println(response.toString());
        }
    }
    로그인 후 복사

    문서를 일괄 추가

    아아아아

    위 내용은 SpringBoot+Elasticsearch가 데이터 검색을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

    관련 라벨:
    원천:yisu.com
    본 웹사이트의 성명
    본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
    인기 튜토리얼
    더>
    최신 다운로드
    더>
    웹 효과
    웹사이트 소스 코드
    웹사이트 자료
    프론트엔드 템플릿