elasticsearch各种查询

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

一、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)$
• 钱的输入格式:

  1. 有四种钱的表示形式我们可以接受:“10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:^ [1-9][0-9]*$
  2. 这表示任意一个不以0开头的数字,但是,这也意味着一个字符"0"不通过,所以我们采用下面的形式:^(0|[1-9][0-9]*)$
  3. 一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9]*)$
  4. 这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧。下面我们要加的是说明可能的小数部分:^ [0-9]+(.[0-9]+)?$
  5. 必须说明的是,小数点后面至少应该有1位数,所以"10."是不通过的,但是 “10” 和 “10.2” 是通过的:^ [0-9]+(.[0-9]{2})?$
  6. 这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^ [0-9]+(.[0-9]{1,2})?$
  7. 这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^ [0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$
  8. 1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$
  9. 备注:这就是最终结果了,别忘了"+“可以用”"替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里
    • 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被高亮
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值