Elasticsearch与SpringBoot结合

1. 添加依赖
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>
2. 配置
spring:
  elasticsearch:
    rest:
      uris: http://localhost:9200
3. 获取ElasticsearchTemplate
package com.zqh.essearch.config;

import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.support.DefaultConversionService;
import org.springframework.data.elasticsearch.config.ElasticsearchConfigurationSupport;
import org.springframework.data.elasticsearch.core.ElasticsearchEntityMapper;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.EntityMapper;

import java.net.InetAddress;
import java.net.UnknownHostException;

@Configuration
public class ElasticsearchConfig extends ElasticsearchConfigurationSupport {

    @Bean
    public Client elasticsearchClient() throws UnknownHostException {
        Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
        return client;
    }

    @Bean(name = {"elasticsearchOperations", "elasticsearchTemplate"})
    public ElasticsearchTemplate elasticsearchTemplate() throws UnknownHostException {
        return new ElasticsearchTemplate(elasticsearchClient(), entityMapper());
    }

    // use the ElasticsearchEntityMapper
    @Bean
    @Override
    public EntityMapper entityMapper() {
        ElasticsearchEntityMapper entityMapper = new ElasticsearchEntityMapper(elasticsearchMappingContext(),
                new DefaultConversionService());
        entityMapper.setConversions(elasticsearchCustomConversions());
        return entityMapper;
    }
}
4. POJO类定义
package com.zqh.essearch.pojo;

import lombok.Data;
import org.springframework.data.elasticsearch.annotations.Document;

import java.util.List;

@Data
@Document(indexName = "movies", type = "_doc")
public class Movie {
    private String id;
    private String title;
    private List<String> genre;
    private Integer year;
}

5. 查询

A. 分页查询

// 分页查询
@RequestMapping("/page")
public Object pageQuery(
    @RequestParam(required = false, defaultValue = "10") Integer size,
    @RequestParam(required = false, defaultValue = "1") Integer page) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withPageable(PageRequest.of(page, size))
        .build();

    List<Movie> movies = elasticsearchTemplate
        .queryForList(searchQuery, Movie.class);

    return movies;
}

B. range查询

// 单条件范围查询, 查询电影的上映日期在2016年到2018年间的所有电影
@RequestMapping("/range")
public Object rangeQuery() {
	SearchQuery searchQuery = new NativeSearchQueryBuilder()
				.withQuery(new RangeQueryBuilder("year").from(2016).to(2018))
				.build();

	List<Movie> movies = elasticsearchTemplate
				.queryForList(searchQuery, Movie.class);

	return movies;
}

C. match查询

// 单条件查询只要包含其中一个字段
@RequestMapping("/match")
public Object singleCriteriaQuery(String searchText) {
	SearchQuery searchQuery = new NativeSearchQueryBuilder()
			.withQuery(new MatchQueryBuilder("title", searchText))
			.build();

	List<Movie> movies = elasticsearchTemplate
			.queryForList(searchQuery, Movie.class);

	return movies;
}

D. 多条件分页查询

@RequestMapping("/match/multiple")
    public Object multiplePageQuery(
            @RequestParam(required = true) String searchText,
            @RequestParam(required = false, defaultValue = "10") Integer size,
            @RequestParam(required = false, defaultValue = "1") Integer page) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(
                  new BoolQueryBuilder()
                        .must(new MatchQueryBuilder("title", searchText))
                        .must(new RangeQueryBuilder("year").from(2016).to(2018))
                ).withPageable(PageRequest.of(page, size))
                .build();

        List<Movie> movies = elasticsearchTemplate
            .queryForList(searchQuery, Movie.class);

        return movies;
    }

E. 多条件或者查询

// 多条件并且分页查询
    @RequestMapping("/match/or/multiple")
    public Object multipleOrQuery(@RequestParam(required = true) String searchText) {
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
            .withQuery(
                  new BoolQueryBuilder()
                        .should(new MatchQueryBuilder("title", searchText))
                        .should(new RangeQueryBuilder("year").from(2016).to(2018))
                ).build();

        List<Movie> movies = elasticsearchTemplate
            	.queryForList(searchQuery, Movie.class);

        return movies;
    }

F. 精准匹配一个单词,且查询就一个单词

//其中包含有某个给定单词,必须是一个词
@RequestMapping("/term")
public Object termQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(new TermQueryBuilder("title", searchText)).build();

    List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}

精准匹配多个单词

//其中包含有某个几个单词
@RequestMapping("/terms")
public Object termsQuery(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(new TermsQueryBuilder("title", searchText.split("\\s+"))).build();

    List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}

G. 短语匹配

@RequestMapping("/phrase")
public Object phraseQuery(@RequestParam(required = true) String searchText) {
	SearchQuery searchQuery = new NativeSearchQueryBuilder()
			.withQuery(new MatchPhraseQueryBuilder("title", searchText))
			.build();

	List<Movie> movies = elasticsearchTemplate
			.queryForList(searchQuery, Movie.class);

	return movies;
}

H. 只查询部分列

@RequestMapping("/source")
public Object sourceQuery(@RequestParam(required = true) String searchText) {
	SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withSourceFilter(new FetchSourceFilter(
               new String[]{"title", "year", "id"}, new String[]{}))
		.withQuery(new MatchPhraseQueryBuilder("title", searchText))
		.build();

	List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

	return movies;
}

I. 多字段匹配

@RequestMapping("/multiple/field")
public Object allTermsQuery(@RequestParam(required = true) String searchText) {
	SearchQuery searchQuery = new NativeSearchQueryBuilder()
		.withQuery(new MultiMatchQueryBuilder(searchText, "title", "genre")
                   .type(MultiMatchQueryBuilder.Type.MOST_FIELDS))
		.build();

	List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

	return movies;
}

J. 多单词同时包含

// 多单词同时包含
@RequestMapping("/also/include")
public Object alsoInclude(@RequestParam(required = true) String searchText) {
    SearchQuery searchQuery = new NativeSearchQueryBuilder()
        .withQuery(new QueryStringQueryBuilder(searchText)
                   .field("title").defaultOperator(Operator.AND))
        .build();

    List<Movie> movies = elasticsearchTemplate.queryForList(searchQuery, Movie.class);

    return movies;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值