天天看点

es+logstash做搜索

linux安装软件

linux环境:
1`elasticsearch-6.8.12.tar.gz
2`elasticsearch-analysis-ik-6.8.12.zip
3`logstash-5.6.0.tar.gz (ex:刚开始做es时候用的es版本7.x,但是linux中安装的jdk是1.8版本的,7.x需要jdk11,后来查询找到es5.x版本支持jdk1.8,就安装的es5.6.0,由此logstash也就安装的5.6.0版本的,之后linux安装,调试没问题了,去做spring boot的配置(下面会说到)。走到这里傻眼了,es5.6.0是不支持ElasticsearchTemplate的配置的(气死),可我就是想用,无奈回头又去下载、安装了es6.8.12版本,ik分词器也要对应的版本.唯一的好消息是logstash5.6.0版本还能接着用。至此浪费了一天的时间)
4`mysql-connector-java-5.1.7-bin.jar
5`es数据查看用的es-head(只在win上装了),安装步骤网上一堆
           

1·软件安装过程中常见的问题?

基本上能百度到的问题,都会遇到个遍(都不是大问题,根据错误信息很明显),我也是后来搜索问题时看到的,可惜地址没有记下来
1·文件夹写权限问题?
2·不能用root运行运行问题?
3·文件所有者问题?
4·文件没有问题?
5·jdk版本要求问题?
6·linux系统jvm内存问题?
7·忘了
           

2·es安装?

1·解压tar文件
2·编辑/config/jvm.options
    根据系统调整内存大小
3·编辑/config/elasticsearch.yml,配置以下内容
    network.host: 0.0.0.0 #本机地址
    http.port: 9222 #rest api访问端口/节点端口
    transport.tcp.port: 9300 #集群信息交换端口
    discovery.type: single-node #配置单一节点(老板穷啊,拢共4g内存,还想要什么)
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    其它配置根据项目实际情况配置
           

3·es启动?

非root账号运行 /bin/elasticsearch -d

4·ik分词器?

直接一点,在es/plugins新建一个文件夹,ik包解压进去,ok。还有要下zip包哦,不要下源码包

5·数据同步?

刚开始用的elasticsearch-jdbc-2.3.4.1,发现才不到300k,果断换了logstash(其实是会报错,而且项目中需要同步多个表数据,功能可能不完善,最重要的是elk只剩下k没有研究过了)

6·logstash-5.6.0安装?

1· /logstash-5.6.0/data 和 /logstash-5.6.0/logs设置写权限
2· /logstash-5.6.0/bin下新建bin目录,将之前下载的mysql-connector-java-5.1.7-bin.jar 放入/logstash-5.6.0/bin/bin中
3· 根据内存情况调整/logstash-5.6.0/config/jvm.options 中内存参数
4· 修改核心配置文件/logstash-5.6.0/bin/logstash.conf
           

7`logstash.conf配置?

input {
    stdin {
    }
    jdbc {
	  type => "live_user"
       # mysql 数据库链接,mybatis为数据库名
      jdbc_connection_string => "jdbc:mysql://cdb-enpefmum.bj.tencentcdb.com:10119/yuq_live"
      # 用户名和密码
      jdbc_user => "yuq_dev"
      jdbc_password => "[email protected]^l"
      # 驱动 修改为mysql连接包位置
      jdbc_driver_library => "/usr/src/logstash-5.6.0/bin/bin/mysql-connector-java-5.1.7-bin.jar"
      # 驱动类名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "5000"
      # 执行的sql 文件路径+名称
      statement => "select * from user"
      # 设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
      schedule => "* * * * *"
    }
	jdbc {
	  type => "live_circle"
       # mysql 数据库链接,mybatis为数据库名
      jdbc_connection_string => "jdbc:mysql://cdb-enpefmum.bj.tencentcdb.com:10119/yuq_live"
      # 用户名和密码
      jdbc_user => "yuq_dev"
      jdbc_password => "[email protected]^l"
      # 驱动 修改为mysql连接包位置
      jdbc_driver_library => "/usr/src/logstash-5.6.0/bin/bin/mysql-connector-java-5.1.7-bin.jar"
      # 驱动类名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "5000"
      # 执行的sql 文件路径+名称
      statement => "select * from circle_info"
      # 设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
      schedule => "* * * * *"
    }
	jdbc {
	  type => "live_posting"
       # mysql 数据库链接,mybatis为数据库名
      jdbc_connection_string => "jdbc:mysql://cdb-enpefmum.bj.tencentcdb.com:10119/yuq_live"
      # 用户名和密码
      jdbc_user => "yuq_dev"
      jdbc_password => "[email protected]^l"
      # 驱动 修改为mysql连接包位置
      jdbc_driver_library => "/usr/src/logstash-5.6.0/bin/bin/mysql-connector-java-5.1.7-bin.jar"
      # 驱动类名
      jdbc_driver_class => "com.mysql.jdbc.Driver"
      jdbc_paging_enabled => "true"
      jdbc_page_size => "5000"
      # 执行的sql 文件路径+名称
      statement => "select * from user_posting_info"
      # 设置监听间隔  各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
      schedule => "* * * * *"
    }
}
output {
	if [type]=="live_user" {
		elasticsearch {
			#ESIP地址与端口
			hosts => "0.0.0.0:9222"
			#ES索引名称(自己定义的)
			index => "dev"
			#自增ID编号
			document_id => "%{user_id}"
			document_type => "user"
		}
	}
	if [type]=="live_circle" {
		elasticsearch {
			#ESIP地址与端口
			hosts => "0.0.0.0:9222"
			#ES索引名称(自己定义的)
			index => "dev"
			#自增ID编号
			document_id => "%{id}"
			document_type => "circle"
		}
	}
	if [type]=="live_posting" {
		elasticsearch {
			#ESIP地址与端口
			hosts => "0.0.0.0:9222"
			#ES索引名称(自己定义的)
			index => "dev"
			#自增ID编号
			document_id => "%{id}"
			document_type => "posting"
		}
	}
    stdout {
        # JSON格式输出
        codec => json_lines
    }
}
           

项目中需要三张表的数据,所以input有三个jdbc,output做一下判断。

8·logstash启动?

   启动方式很多,我选最简单的:nohup /usr/src/logstash-5.6.0/bin/logstash -f /usr/src/logstash-5.6.0/bin/logstash.conf -w 10 -l /usr/src/logstash-5.6.0/logs/logstash.log &  。

   启动之后每分钟同步一次,linux 时间。

spring boot 配置

项目中boot版本是2.2.6.RELEASE

1·依赖

<dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>6.8.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
            <version>2.1.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-elasticsearch</artifactId>
            <version>3.2.6.RELEASE</version>
        </dependency>
           

这些版本亲测可用,其他高版本可能有冲突,自行调整。

2·properties文件配置?

spring:
  data:
    elasticsearch:
      cluster-name: elasticsearch
      cluster-nodes: ip:9300 #数据交换端口
      repositories:
        enabled: true
  elasticsearch:
    rest:
      uris: ["http://ip:9222"] #rest api访问端口
           

3·不需要配置类,直接注入ElasticsearchTemplate使用

service查询:
 * //示例,查找user_id为5的用户
 * //        PageRequest pageRequest = PageRequest.of(pageNum, pageSize);
 * //        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
 * //        boolQueryBuilder.should(QueryBuilders.termQuery("user_id", 5));
 * //        NativeSearchQuery query = new NativeSearchQueryBuilder().withQuery(boolQueryBuilder).withPageable(pageRequest).build();
 * //        AggregatedPage<EsUserVo> users = elasticsearchTemplate.queryForPage(query, EsUserVo.class);
bean基类:
@Data
@Document(indexName = "user_index",type = "user", shards = 1,replicas = 0, refreshInterval = "-1")
public class EsUserVo
{
    private static final long serialVersionUID = 1L;

    /** 用户ID */
    @Id
    private Long user_id;

    /** 用户账号 */
    @Excel(name = "用户账号")
    private String user_code;
}
           

indexName为数据同步时设置的index,type数据同步时设置的document_type。

4·附加问题?

1·本项目中为db每张表分别创建索引,分别创建type。因为每张表中字段都是不同的。如果字段都是相同的,可以只创建一个索引。
2·type,一般情况下type相当于db中的表
3·一个索引index中,如果有多个type,那么就要求所有type的字段都是一致的
           

继续阅读