Elasticsearch全文检索

Elasticsearch做搜索服务

阅读本文需要有以下基础
如果不知道ELK的安装 请看:ELK日志收集
如果不清楚logstash的配置请参见:logstash应用解耦合

简介

所谓使用Elasticsearch做搜索服务,就是数据量大的时候,数据库无法承载压力,可以将数据放到Elasticsearch做索引,当需要查询的时候直接从Elasticsearch取数据。

步骤

1 Logstash从mysql取出数据
2 Logstash发送数据到Elasticsearch
3 从Elasticsearch查询数据

这里主要的配置在Logstash

配置Logstash

全量数据同步

input {
  jdbc {
    # mysql连接jar包位置
    jdbc_driver_library => "/path/mysql-connector-java-6.0.6.jar"
    # 连接类 5.*版本为com.mysql.jdbc.Driver  6.*版本为com.mysql.cj.jdbc.Driver
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    # 数据库链接
    jdbc_connection_string => "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&useSSL=false"
    jdbc_user => "root"
    jdbc_password => "password"
    statement => "SELECT * FROM company_info"
    jdbc_paging_enabled => "true"
    jdbc_page_size => "5000"
    schedule => "*/10 * * * *"
  }
}

filter {
   json {
        source => "message"
        remove_field => ["message"]
    }
}

output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    # COMPANY_ID为上表的主键
	document_id => "%{COMPANY_ID}"
    index => "company_info "
  }
  stdout {
    codec => rubydebug
  }
}

增量数据同步

# 配置从mysql输入数据
input {
  jdbc {
  	# mysql连接jar包位置
    jdbc_driver_library => "/path/mysql-connector-java-6.0.6.jar"
    # 连接类 5.*版本为com.mysql.jdbc.Driver  6.*版本为com.mysql.cj.jdbc.Driver
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
    # 数据库链接
    jdbc_connection_string => "jdbc:mysql://localhost:3306/test?characterEncoding=UTF-8&useSSL=false"
    # 数据库用户
    jdbc_user => "root"
    # 数据库密码
    jdbc_password => "123456"
    # 是否启用分页
    jdbc_paging_enabled => "true"
    # 每一批传输的数量
    jdbc_page_size => "1000"
    # 多长时间执行一次 cron表达式 以下为每分钟执行一次
    schedule => "* * * * *"
    # 时区
    jdbc_default_timezone => "Asia/Shanghai"
    # 是否保存状态
    record_last_run => "true"
    # true 使用定义的 tracking_column值作为:sql_last_value
    # false :sql_last_value反映上次执行查询的时间
    use_column_value => "true"
    # 配合use_column_value使用
    # 这样配置后,下面的statement选项可以使用了
    tracking_column => "UPDATE_TIME"
    # 记录:sql_last_value的文件
    last_run_metadata_path => "/path/last_run_time.log"
    # 是否将数据库中的列名自动转换为小写
    lowercase_column_names => "false"
    # tracking_column的数据类型,只能是numberic和timestamp
    tracking_column_type => "timestamp"
    # 是否应清理先前的运行状态,不清楚什么用
    clean_run => "false"
    # 从数据库中抓数据的SQL脚本
    statement => "SELECT * FROM company_info where UPDATE_TIME > :sql_last_value"
  }
}

filter {
  json {
    source => "message"
    remove_field => ["message"]
  }
}

# 配置数据输出位置
output {
  elasticsearch {
    hosts => ["http://localhost:9200"]
    # COMPANY_ID为上表的主键
	document_id => "%{COMPANY_ID}"
    index => "company_info "
  }
  stdout {
    codec => rubydebug
  }
}

从Elasticsearch查询数据

curl 'localhost:9200/company_info/_search?q=*&pretty'
// 返回数据
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 56,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "share_sys_company_info",
        "_type" : "_doc",
        "_id" : "788e3fd383344e7eb4612412661b1676",
        "_score" : 1.0,
        #~~~~~~~~~~~ 这就是我数据库中的数据 ~~~~~~~~~~~~~~~
        "_source" : {
          "BUSSINESS_TYPE" : "4bdbdb5beff946a3ab161fbf18ef6145",
          "COMPANY_ROLE" : "",
          "@version" : "1",
          "SHORT_NAME" : "无锡换热器厂",
          "COMPETENCY_TYPE" : "2",
          "PARENT_COMPANY" : "-1",
          "NETWORK_STATUS" : null,
          "GOVERN_TYPE" : null,
          "CREATE_TIME" : "2019-03-13T09:40:42.000Z",
          "UPDATE_USER" : "99408e75541f425886dc50c3186292eb",
          "COMPANY_ID" : "788e3fd383344e7eb4612412661b1676",
          "UPDATE_TIME" : "2019-04-16T11:11:15.000Z",
          "LOGO" : null,
          "NAME" : "无锡市换热器厂",
          "DEL_FLAG" : "N",
          "BIN_CODE" : "58821",
          "URL" : null,
          "NETWORK_EXPIRED" : null,
          "@timestamp" : "2019-07-30T08:18:02.096Z",
          "MARK" : "29",
          "NETWORK_DATE" : null,
          "NETWORK_SIGN" : null,
          "PIDS" : "-1",
          "GROUP_TYPE" : "b77c305c79294a26a230b16e8ced3235",
          "CREATE_USER" : "99408e75541f425886dc50c3186292eb",
          "CORP_TYPE" : "150df743bc134e47be7b7d97ad8e3adb",
          "LOGO_PRO" : "c340f509b2b54b82accbf4dba63c2cca",
          "ORDERED" : 29
        }
      }
     }
    ]
  }
}

参考
https://www.elastic.co/guide/cn/elasticsearch/guide/current/query-dsl-intro.html
https://juejin.im/post/5b7fe4a46fb9a019d92469a9#heading-11
https://www.cnblogs.com/gqhwk/p/9440787.html

原文地址:https://www.cnblogs.com/paper-man/p/13284645.html