SpringBoot - ElasticSearch

1.什么是ElasticSearch

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

我们建立一个网站或应用程序,并要添加搜索功能,但是想要完成搜索工作的创建是非常困难的。我们希望搜索解决方案要运行速度快,我们希望能有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP来索引数据,我们希望我们的搜索服务器始终可用,我们希望能够从一台开始并扩展到数百台,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。因此我们利用Elasticsearch来解决所有这些问题及可能出现的更多其它问题。

ElasticSearch对事物的处理能力差,但是对数据检索的能力很强。

2.部属ElasticSearch

继续祭出我们的神奇的Docker。

  • docker pull elasticsearch 安装elasticsearch。
  • docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9200:9200 -p 9300:9300 --name mysearch 671bb2d7da44这里额外的参数要注意下,ES_JAVA_OPTS="-Xms256m -Xmx256m 为申请内存的大小,9200为服务访问端口,9300为在分布式情况下节点间通讯的接口。
  • 此时我们访问本地的9200端口返回以下数据就说明部署成功。


    访问9200端口

3.ElasticSearch入门教程

一切请参考ElasticSearch官方文档

4.SpringBoot与ElasticSearch

首先依旧查看SpringBoot中有关于ElasticSearch的自动配置类。
我们发现在两个方法可以操作ElasticSearch:

  • Jest,基于HTTP的。
  • SpringData操作,基于TCP。

a.Jest

  1. 首先添加Maven
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
    <groupId>io.searchbox</groupId>
    <artifactId>jest</artifactId>
    <version>5.3.3</version>
</dependency>
  1. 配置文件,记得加上http://,使用的是9200端口
spring:
  elasticsearch:
    jest:
      uris: http://192.168.15.128:9200
  1. 配置测试Bean文件,需要添加@JestID声明主键
public class UserBean {

    @JestId
    int id;
    String name;
    int age;
    String password;

    public UserBean(int id, String name, int age, String password) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.password = password;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
 ....
}
  1. 测试文件
@RunWith(SpringRunner.class)
@SpringBootTest
public class ElasticApplicationTests {
    @Autowired
    JestClient jestClient;

    @Test
    public void save() {
        UserBean userBean = new UserBean(1, "baozhou", 27, "123456");
        //构建一个索引功能
        Index build = new Index.Builder(userBean).index("indexname").type("users").build();
        try {
            //执行
            jestClient.execute(build);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Test
    public void search() {
        String queryJson = "{\n" +
                "    \"query\" : {\n" +
                "        \"match\" : {\n" +
                "            \"name\" : \"baozhou\"\n" +
                "        }\n" +
                "    }\n" +
                "}";
        //构建一个搜索
        Search build = new Search.Builder(queryJson).addIndex("indexname").addType("users").build();
        try {
            //执行
            SearchResult result =jestClient.execute(build);
            System.out.println(result.getJsonString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    }

b.SpringData

使用SpringData非常曲折,在SpringBoot2.x里折腾了半天也没有调通,最后使用了SpringBoot 1.x
首先一点需要注意的是SpringData于ElasticSearch是有版本对应规则的,详情对应参考https://github.com/spring-projects/spring-data-elasticsearch

在SpringData下也有两种工具可以操作Elasticsearch,他们分别为ElasticsearchRepository,ElasticsearchTemplate。有关于他们的使用方法可以参考SpringData官方文档,当然接下来也要演示一下使用方法。

1. ElasticsearchRepository

  1. 配置文件
spring:
  data:
    elasticsearch:
      cluster-nodes: 192.168.15.128:9301
      cluster-name: elasticsearch
  1. Bean文件,注意添加标注,说明添加的索引以及类型。
@Document(indexName = "test", type = "book")
public class TestBean {
    Integer id;
    String name;
    String author;

    public TestBean(Integer id, String name, String author) {
        https://github.com/spring-projects/spring-data-elasticsearch
        this.id = id;
        this.name = name;
        this.author = author;
    }
....
}

3.定义Repository文件。假如只是需要基础功能,那么只需要继承Repository即可。要增加功能,只需要像官方文档中的示例按名称申明接口即可(并不需要去实现)。

// 基础功能
public interface ElasticsearchRepository<T, ID extends Serializable> extends ElasticsearchCrudRepository<T, ID> {
    <S extends T> S index(S var1);

    Iterable<T> search(QueryBuilder var1);

    Page<T> search(QueryBuilder var1, Pageable var2);

    Page<T> search(SearchQuery var1);

    Page<T> searchSimilar(T var1, String[] var2, Pageable var3);

    void refresh();

    Class<T> getEntityClass();
}
// 自定义语句
  public interface BookRepository extends Repository<Book, String> {

        List<Book> findByNameAndPrice(String name, Integer price);

        List<Book> findByNameOrPrice(String name, Integer price);
        
        Page<Book> findByName(String name,Pageable page);

        Page<Book> findByNameNot(String name,Pageable page);

        Page<Book> findByPriceBetween(int price,Pageable page);

        Page<Book> findByNameLike(String name,Pageable page);

        @Query("{\"bool\" : {\"must\" : {\"term\" : {\"message\" : \"?0\"}}}}")
        Page<Book> findByMessage(String message, Pageable pageable);
    }

4.操作存储一个数据。

    @Autowired
    TestRepository testRepository;

    @Test
    public void contextLoads() {
        testRepository.index(new TestBean(1,"baozhou","zuozhe"));
    }

2. ElasticsearchTemplate

暂时留空,以后用到回来填坑。

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

推荐阅读更多精彩内容