一、Kibana高级查询
1.1、简易版查询
实际开发中是通过SpringBoot进行整合的,整合很简单,不过底层的查询也需要了解一下
(1)根据id进行查询
GET /myJob/user/12
(2) 查询当前所有类型的文档
GET / myJob /user/_search
(3)根据多个ID批量查询
查询多个id分别为1、2
GET / myJob /user/_mget
{
"ids":["1","2"]
}
(4)复杂条件查询
查询年龄为年龄21岁
GET / myJob /user/_search?q=age:21
查询年龄30岁-60岁之间
GET / myJob /user/_search?q=age[30 TO 60]
注意:TO 一定要大写
查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据
GET / myJob /user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1
查询年龄30岁-60岁之间 并且年龄降序、从0条数据到第1条数据,展示name和age字段
GET / myJob /user/_search?q=age[30 TO 60]&sort=age:desc&from=0&size=1
&_source=name,age
1.2、Dsl语言查询与过滤(用的最多)
什么是DSL语言:
es中的查询请求有两种方式,一种是简易版的查询。另外一种是使用JSON完整的请求体,叫做结构化查询(DSL),较常用。
DSL查询是POST过去一个json,由于post的请求是json格式的,所以存在很多灵活性,也有很多形式:
(1)根据名称精确查询姓名
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
GET myJob /user/_search
{
"query": {
"term": {
"name": "xiaoming"
}
}
}
(2)根据汽车名称模糊查询
match查询相当于模糊匹配,只包含其中一部分关键词就行
GET / myJob /user/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"car": "奥迪"
}
}
}
(3)Term与Match区别
Term查询不会对字段进行分词查询,会采用精确匹配;
Match会根据该字段的分词器,进行分词查询。
(4)使用filter过滤年龄
GET / myJob /user/_search
{
"query": {
"bool": {
"must": [{
"match_all": {}
}],
"filter": {
"range": {
"age": {
"gt": 21,
"lte": 51
}
}
}
}
},
"from": 0,
"size": 10,
"_source": ["name", "age"]
}
二、分词器
什么是分词器:
因为ES中默认的标准分词器对中文不是很友好,会将中文词语拆分成一个个中文的汉字,所以要引入中文分词器es-ik插件
到gitHub下载es-ik:下载地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
演示传统分词器:
http://192.168.212.181:9200/_analyze
{
"analyzer": "standard",
"text": "奥迪a4l"
}
{
"tokens": [
{
"token": "奥",
"start_offset": 0,
"end_offset": 1,
"type": "<IDEOGRAPHIC>",
"position": 0
},
{
"token": "迪",
"start_offset": 1,
"end_offset": 2,
"type": "<IDEOGRAPHIC>",
"position": 1
},
{
"token": "a4l",
"start_offset": 2,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 2
}
]
}
注意: es-ik分词插件版本一定要和es安装的版本对应
Linux下安装:
第一步:下载es的IK插件命名改为ik插件
第二步: 上传到/usr/local/elasticsearch-6.4.3/plugins
第三步: 重启elasticsearch即可
自定义扩展字典:
在/usr/local/elasticsearch-6.4.3/plugins/ik/config目录下:
vi custom/new_word.dic
老铁
王者荣耀
洪荒之力
共有产权房
一带一路
哈哈哈
vi IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">custom/new_word.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
三、文档映射
索引(index)相当于数据库,类型(type)相当于数据表,映射(Mapping)相当于数据表的表结构。
文档中的映射就是给文档中的字段指定字段类型、分词器。
使用GET /hello/user/_mapping
1.1、映射的分类
(1)动态映射
在关系数据库中,需要事先创建数据库,然后在该数据库实例下创建数据表,然后才能在该数据表中插入数据;
但是,在ES中不需要事先定义映射,文档写入ES时会根据文档字段自动识别类型,这种机制较动态映射。
默认类型为long类型
(2)静态映射
在ES中也可以事先定义好映射,包含文档的各个字段及其类型等,这种机制较静态映射。
1.2、ES类型支持
(1)基本类型
字符串:String(包含text和keyword);
text:该类型被用来索引长文本,在创建索引前会将这些文本进行分词,转化为词的组合。
建立索引:允许ES来检索这些词,text类型不能用来排序和聚合。
keyword:该类型不需要进行分词,可以被用来检索过滤、排序、聚合。
(注意: keyword类型不能分词,Text类型可以分词查询)
(注意:ES已经把type(类型)移除了,是自动识别类型)
数指型:long、integer、short、byte、double、float
日期型:date
布尔型:boolean
二进制型:binary
数组类型(Array datatype)
(2)复杂类型
地理位置类型(Geo datatypes):
- 地理坐标类型(Geo-point datatype):geo_point 用于经纬度坐标
- 地理形状类型(Geo-Shape datatype):geo_shape 用于类似于多边形的复杂形状
特定类型(Specialised datatypes):
- Pv4 类型(IPv4 datatype):ip 用于IPv4 地址
- Completion 类型(Completion datatype):completion 提供自动补全建议
- Token count 类型(Token count datatype):token_count 用于统计做子标记的字段的index数目,该值会一直增加,不会因为过滤条件而减少
- mapper-murmur3 类型:通过插件,可以通过_murmur3_来计算index的哈希值
- 附加类型(Attachment datatype):采用mapper-attachments插件,可支持_attachments_索引,例如 Microsoft office 格式,Open Documnet 格式, ePub,HTML等
1.3、例子:创建文档类型并且指定类型
POST /myJob/_mapping/user
{
"user":{
"properties":{
"age":{
"type":"integer"
},
"sex":{
"type":"integer"
},
"name":{
"type":"text",
"analyzer":"ik_smart",
"search_analyzer":"ik_smart"
},
"car":{
"type":"keyword"
}
}
}
}