• 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

  • 相关阅读:
    .gitignore语法
    每日阅读
    css摘要
    ubuntu安装qq、微信
    django中views中方法的request参数
    js html标签select 中option 删除除了第一行外的其他行
    js 新增标签、标签属性
    python中None与0、Null、false区别
    python class中__init__函数、self
    for foreach循环
  • 原文地址:https://www.cnblogs.com/paper-man/p/13284645.html
Copyright © 2020-2023  润新知