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;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,657评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,889评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,057评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,509评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,562评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,443评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,251评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,129评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,561评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,779评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,902评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,621评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,220评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,838评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,971评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,025评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,843评论 2 354

推荐阅读更多精彩内容

  • 前言 本文主要介绍 Elasticsearch的一些检索技巧,提供了详尽的源码举例,并配有相应的Java API实...
    mysia阅读 755评论 0 1
  • 本节将详细介绍es Search API的查询主体,定制化查询条件的实现主体。 query 搜索请求体中查询条件使...
    中间件兴趣圈阅读 1,489评论 0 1
  • 阿明醒来的时候,周围一片白,脆弱的视神经有几分被炙烤的感觉。眩晕了几分钟,他才仔细的打量周围。 这是医院,好像是特...
    香皮骨饭阅读 231评论 0 0
  • 乘龙引*引子 乘龙引(1)*孤骑,疾行向西(1) 乘龙引(2)*孤骑,疾行向西(2) 乘龙引(3)*匾额,铁画...
    剑仙裴宣阅读 817评论 1 8
  • 幸福是一个词,是一种感受,更是一种享受。懒惰的人享受的是空虚,努力的人享受的是充实。 蓝天没有白云的...
    白沙小学李雯阅读 255评论 0 0