IT技术篇Spring Boot程序员

springboot 2.0 + elasticsearch 5

2018-06-10  本文已影响376人  陶源0111

       前一阵子准备为项目搭建一个简单的搜索服务,虽然业务数据库mongodb提供了文本搜索的支持,但是在大量文档需要通过关键词进行定位时,es明显更加适合去作为一个搜索引擎(虽然我们之前大部分使用到了ELK那套分析和可视化的特性)。Elasticsearch建立在Lucene之上并且支持极其快速的查询和丰富的查询语法,偶尔也可以作为一个轻量级的NoSQL。但是对复杂查询和聚合操作的能力并不是很强。
       本篇不会提及如何搭建一个简单搜索服务,而是记录一下大约一周工作时间内遇见的几个坑。。

       为什么选择elasticsearch 5.x?
       新服务没有任何历史包袱,理论上应该用最新的6.x,然而spring-data-elasticsearch只支持到的5.x,时间紧也无法很好直接封装一层api,也是因为ELK那套东西之前版本混乱,无奈es从2.x直接到了5.x。查询一下5.x和2.x的差别,简单说就是磁盘空间-50%,索引时间-50%,查询性能+25%。
       由于spring-data-elasticsearch必须升级到3.0.7,导致spring必须升级到2.x,也直接导致了后面踩到的坑。

@Component
public class ESconfig {
    @Bean
    public TransportClient transportClient() throws UnknownHostException {
        TransportClient client = new PreBuiltXPackTransportClient(Settings.builder()
                .put("cluster.name", "docker-cluster")
                .put("xpack.security.user", "elastic:changeme")
                .build())
                .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("0.0.0.0"), 9300));
        return client;
    }
}

这也是因为不想再到docker里去处理x-path这个插件而选择的一个比较快捷的解决方案,没必要的情况下,暂时也不用接触到es本身的一些东西。

    @Bean
    SimpleMessageListenerContainer container(ConnectionFactory connectionFactory,
            MessageListenerAdapter listenerAdapter,
            MQconfig properties) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(properties.getQueueName());
        container.setMessageListener(listenerAdapter);

        return container;
    }

    @Bean
    MessageListenerAdapter listenerAdapter() {
        MessageListenerAdapter listenerAdapter = new MessageListenerAdapter(itemConsumer,
                "consume");
        return listenerAdapter;
    }

问题在于gradle配置的时候,找了很久如何使得build出来的jar包可以指定-Dloader.main指定启动Application,解决方法如下:
在xxx.gradle文件里添加

bootJar {
    manifest {
        attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'
    }
}

在springboot 1.5.9的项目里,需要指定启动Application,需要添加

springBoot{
    layout = "ZIP"
}

查看是否生效的办法是build以后 直接解压jar包,在xxx(项目名)/META-INFO/MANIFEST.MF里查看,如果

Main-Class: org.springframework.boot.loader.PropertiesLauncher

则正确,如果

Main-Class: org.springframework.boot.loader.JarLauncher

则依旧会启动文件里的Start-Class

    // analyzer是自己的分词器名字
    @Field(type = FieldType.Text, index = true, analyzer = "synonym")
    private String description;

由于es的mapping无法修改,只能通过手动创建一个新的mapping,再通过reIndex方法去backfill数据(es5.x自带了reIndex 的api)。网上有通过alias的方法,在某些修改场景下,不需要重新启动/部署应用就可以平滑的修改mapping,具体可以查询了解一下。

以上差不多搭建一个搜索服务踩到的一些坑,有几个消耗了大量时间和精力去解决,在此列出来希望希望有借鉴意义。之后搜索服务有优化的地方,还会继续慢慢更新

上一篇下一篇

猜你喜欢

热点阅读