elasticsearch学习(三)——Kibana高级查询与分词器

一、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"
      
       }
    }
  }
  
}
发布了52 篇原创文章 · 获赞 116 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/RuiKe1400360107/article/details/103882339
今日推荐