Windows 搭建ES(Elasticsearch)并从数据库导入数据

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。

一 实现方式

Elasticsearch版本

目前Elasticsearch最新版本为7.2.0,因为Elasticsearch各个版本之间的API并不是完全兼容,一些参数可能在新版本中已经更改或者已经废弃,而官方并不能及时提供对应的文档,所以本次验证都是基于Elasticsearch6.7.0版本。

其他环境要求

系统:Windows 10

JDK版本:1.8

搭建单节点服务

下载Elasticsearch6.7.0,解压,然后进入解压目录下的bin目录,直接点击elasticsearch.bat或者命令行运行即可启动elasticsearch。elasticsearch默认端口是9200,在浏览器中输入http://127.0.0.1:9200可以看到该节点的相关信息。

 

elasticsearch-head

elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。

启动了elasticsearch-head并不能直接连接启动了的elasticsearch服务,需要在elasticsearch的config目录下修改elasticsearch.yml配置文件。

在文件后面加上:

http.cors.enabled: true

http.cors.allow-origin: "*"

重新启动elasticsearch即可在elasticsearch-head中查看到刚刚启动的elasticsearch服务。

开始搜索

创建索引和type:

在postman中发送http请求来新建。

URL:http://127.0.0.1:9210/user

方法:PUT

请求体:

{

  "settings": {

    "number_of_replicas": 0,

    "number_of_shards": 5

  },

  "mappings":{

    "car":{

      "properties": {

        "carId":{

          "type" : "integer"

        },

        "name":{

          "type" : "keyword"

        },

        "firm":{

          "type" : "keyword"

        },

        "structure" :{

          "type" : "keyword"

        },

        "energy" : {

          "type" : "keyword"

        },

        "tags": {

          "type" : "text"

        },

        "image":{

          "type" : "keyword"

        },

        "price" :{

          "type" : "double"

        },

        "suggest": {

          "type": "completion"

        }

      }

    }

  }

}

即可新建user索引,car为type,以及一些type对应的字段。

匹配查询有query和filter两种,query查询在查询结果中会有_score(得分,可以理解为查询的匹配度),查询结果按照_score结果降序排列。filter不会去计算查询结果的_score,所以filter的效率比query更高。

match查询和term查询,match查询会将查询的关键词进行分词,但是term不会对查询关键词分词。

Bool查询:

Bool查询可以提供组合查询的方式,包括must/should/must_not分别等同于and/or/not。

。。。等等灵活多变的查询方式

将mysql中的数据同步到Elasticsearch中

采用的方案是用logstash的logstash-input-jdbc插件来实现mysql和Elasticsearch的数据同步。

需要下载logstash6.7.0,logstash版本需要与Elasticsearch版本号对应。

在bin目录下新建logstash.conf,内容如下:

input {

jdbc {

jdbc_connection_string => "jdbc:mysql://10.1.1.100:3306/everams_db"

jdbc_user => "root"

jdbc_password => "root"

jdbc_driver_library => "E:/repository/mysql/mysql-connector-java/5.1.46/mysql-connector-java-5.1.46.jar"

jdbc_driver_class => "com.mysql.jdbc.Driver"

jdbc_paging_enabled => "true"

jdbc_page_size => "50000"

statement_filepath => "D:/tools/es/sync.sql"

}

}

 

output {

#设置窗口日志输出

stdout {

        codec => json_lines

    }

elasticsearch {

hosts => ["127.0.0.1:9200"]

index => "managers"

document_type => "core_managers"

}

}

Input表示数据源,数据源为jdbc,需要配置好mysql中表的地址,用户名,密码,mysql-connector-java的jar包位置以及sql文件的位置。

Output中stdout 表示控制台输出,elasticsearch 表示输出到elasticsearch 服务中,需要提前在elasticsearch 中建好索引,type可以不建。

让logstash以logstash.conf的方式启动,可以写个run.bat封装好对应的命令:

logstash.bat -f logstash.conf

模糊查询速度对比:

将一张含有10182582条数据的表同步到elasticsearch中。

Mysql模糊查询:

 

Elasticsearch  query查询:

 

Elasticsearch  filter查询:

 

Elasticsearch  fuzzy查询:

 

通过模糊查询对比,查到的数据量都是131509条,时间上却有很大的差异。