一、Windows下logstash的安装
1.下载地址为:https://www.elastic.co/downloads/logstash ,下载与ES版本一致
2.解压
3.在bin文件夹下创建logstash.conf,并添加以下内容
input {
stdin{
}
}
output {
stdout{
}
}
4.启动logstash:logstash -f logstash.conf
5.访问http://localhost:9600/,检查是否启动成功
二、logstash实现MySQL数据迁移至es
1.下载mysql-connector-java,并放在logstash目录下
地址:https://dev.mysql.com/downloads/connector/j/5.1.html

2.在logstash的bin目录下添加mysql_info.conf,并添加以下代码
input {
stdin {
}
jdbc {
# mysql数据库连接,es_test是mysql的数据库
jdbc_connection_string => "jdbc:mysql://172.16.187.30:3306/es_test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC"
# mysqly用户名和密码
jdbc_user => "root"
jdbc_password => "123456"
# 驱动配置
jdbc_driver_library => "D:\logstash-7.11.1\mysql\mysql-connector-java-8.0.23\mysql-connector-java-8.0.23.jar"
# 驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 执行指定的sql文件
#statement_filepath => "D:\service\logstash-7.7.0\mysql\sql\fa_search.sql"
#执行的sql语句,查询源数据的sql语句(output就是将此处的查询结果insert到ES中)
statement => "SELECT * FROM es_data"
# 设置监听 各字段含义 分 时 天 月 年 ,默认全部为*代表含义:每分钟都更新
schedule => "* * * * *"
# 索引类型
#type => "blog"
}
}
output {
elasticsearch {
#es服务器
hosts => ["172.16.187.28:9200"]
#ES索引名称
index => "mysql_data"
#自增ID
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
注意,若配置文件缩进或格式不对,启动会报错
3.最后启动logstash -f mysql_info.conf
三、elasticsearch复杂查询
1.wildcard通配符查询
#查询name包含zh的人名
GET school/_search?pretty
{
“query”: {
“wildcard”: {
“name”: {
“value”: “zh*”
}
}
},
“_source”: “*”
}
常用通配符:?匹配任意字符,*匹配0或多个字符,.匹配单个字符
当然也有匹配不到的情况,原因是数据被进行了分词,但使用的通配未在分词内
如,姓名:张韶涵,分词有:张韶涵,韶,涵,若使用通配符张涵*,则无法匹配*
2.regexp正则查询
#查询以zh开头,总共7个字母的名字
GET school/search
{
“query”: {
“regexp”: {
“name”: “zh[a-z]{5}”
}
}
}
校验数字类型的表达式

校验字符的表达式

校验特殊需求的表达式
• Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$
• 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.?
• InternetURL:[a-zA-z]+://[^\s] 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$
• 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
• 电话号码(“XXX-XXXXXXX”、“XXXX-XXXXXXXX”、“XXX-XXXXXXX”、“XXX-XXXXXXXX”、"XXXXXXX"和"XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
• 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
• 电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号): ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))KaTeX parse error: Undefined control sequence: \d at position 42: …验位,可能为数字或字符X:(^\̲d̲{15})|(^\d{18}KaTeX parse error: Undefined control sequence: \d at position 5: )|(^\̲d̲{17}(\d|X|x))
• 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^ [a-zA-Z][a-zA-Z0-9]{4,15}$
• 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^ [a-zA-Z]\w{5,17}$
• 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在 8-10 之间):^(?=.\d)(?=.[a-z])(?=.[A-Z])[a-zA-Z0-9]{8,10}$
• 强密码(必须包含大小写字母和数字的组合,可以使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.[A-Z]).{8,10}$
• 日期格式:^\d{4}-\d{1,2}-\d{1,2}
• 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$
• 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
• 钱的输入格式:
- 有四种钱的表示形式我们可以接受:“10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:^ [1-9][0-9]*$
- 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
- 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
- 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^ [0-9]+(.[0-9]+)?$
- 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 “10” 和 “10.2” 是通过的:^ [0-9]+(.[0-9]{2})?$
- 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^ [0-9]+(.[0-9]{1,2})?$
- 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^ [0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
- 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
- 备注:这就是最终结果了,别忘了"+“可以用”"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
• xml文件:^([a-zA-Z]±?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$
• 中文字符的正则表达式:[\u4e00-\u9fa5]
• 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))
• 空白行的正则表达式:\n\s\r (可以用来删除空白行)
• HTML标记的正则表达式:<(\S*?)[^>]>.?|<.? /> ( 首尾空白字符的正则表达式:^\s|\s*KaTeX parse error: Undefined control sequence: \s at position 4: 或(^\̲s̲*)|(\s*) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)
• 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)
• 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
• IPv4地址:((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})(.((2(5[0-5]|[0-4]\d))|[0-1]?\d{1,2})){3}
3.prefix前缀查询
查询子首的,可以指定字段的前缀,从而查询到指定的文档,可以实现类似百度输入后弹出提示的效果。
#以x开头的学生名字
GET school/_search
{
“query”: {
“prefix”: {
“name”: {
“value”: “x”
}
}
}
}
4.fuzzy模糊查询
模糊查询,根据输入的内容大概的搜索,可以输入错别字,不是很稳定,比如输入网一来搜索网易就搜不到。
#是否能搜索出travel内容
GET school/_search
{
“query”: {
“fuzzy”: {
“about”: {
“value”: “trvel”
}
}
}
}
PS:prefix,fuzzy,wildcard,regexp,查询的效率相对比较低,要求效率高的时候,不要使用这个
5.cardinality去重查询
去掉重复的数据,然后算出总数。
使用name.keyword,则在查询时不对name进行分词
#按姓名去重后计数,name_count是自己取的名字,对结果无影响
GET school/_search?pretty
{
“aggs”: {
“name_count”:{
“cardinality”:{“field”:“name.keyword”}
}
}
}
返回结果,去重计数展示在末尾
“aggregations” : {
“agg” : {
“value” : 9
}
}
6.聚合查询
#统计名字叫zhangfei的数据条数
GET school/_count?q=name:zhangfei
#对年龄进行范围筛选,from 大于等于,to 小于
GET school/_search
{
"aggs":{
"age_range":{
"range": {
"field": "age",
"ranges": [
{
"from": 20,
"to": 30
}
]
}
}
}
}
GET school/_search
{
"query": {
"range": {
"age": {
"gte": 20,
"lt": 30
}
}
}
}
#筛选喜欢旅游并且年龄在20岁以上的人数(使用去重计数,保证人未重复)
GET school/_search
{
"query": {
"bool": {
"must": [
{"term": {
"about": {
"value": "travel"
}
}},
{"range": {
"age": {
"lte": 20
}
}}
]
}
},
"aggs": {
"name_count": {
"cardinality": {
"field": "name.keyword"
}
}
}
}
#多个聚合查询
#统计“斗地主”的消费金币和盈利金币
GET mysql_data/_search?pretty
{
"query": {
"term": {
"游戏名称.keyword": {
"value": "斗地主"
}
}
},
"aggs": {
"sum_bet": {
"sum": {
"field": "消费金币"
}
},
"sum_valid":{
"sum":{
"field":"盈利金币"
}
}
}
}
7.高亮查询
将用户输入的内容,以高亮的样式展示出来,查询的结果会附带在hits下面以单独的形式返回,不会影响查询的结果
#高亮展示travel
GET school/_search
{
"query": {
"bool": {
"must": [
{"term": {
"about": {
"value": "travel"
}
}},
{"range": {
"age": {
"lte": 20
}
}}
]
}
},
"highlight": {
"fields": {
"about": {}
}
}
}
返回结果中travel被高亮

本文介绍了如何在Windows上安装Logstash以及使用Logstash迁移MySQL数据到Elasticsearch。接着详细讲解了Elasticsearch的复杂查询,包括wildcard通配符、regexp正则、prefix前缀、fuzzy模糊、cardinality去重、聚合和高亮查询等操作。
1814

被折叠的 条评论
为什么被折叠?



