“这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战”
上一篇介绍了ElasticSearch核心基础语法第二篇,本节介绍ElasticSearch核心语法第三篇。
一、单条件查询
官网地址:www.elastic.co/guide/en/el…
精确匹配:term、terms、range、exists、ids
1. terms
单个字段属于某个值数组内的值
GET /moe_db/_doc/_search
{
"query": {
"terms": {
"name": [
"admin",
"moe"
]
}
}
}
复制代码
2. range
字段属于某个范围内的值
GET /moe_db/_doc/_search
{
"query": {
"range": {
"age": {
"gte": 18,
"lte": 30
}
}
}
}
复制代码
3. exists
某个字段是否存在
GET /moe_db/_doc/_search
{
"query": {
"exists": {
"field": "name"
}
}
}
复制代码
4. ids
通过ID批量查询
GET /moe_db/_doc/_search
{
"query": {
"ids": {
"values": [
1,
2,
6
]
}
}
}
复制代码
二、多条件查询
多条件查询就是将单个条件进行组合起来查询。
1. bool
各个条件进行组合(and、or、not)关系。
2. must
各个条件都必须满足,即各条件是and的关系
POST /moe_db/_doc/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"name": "admin"
}
},
{
"term": {
"age": 30
}
}
]
}
}
}
复制代码
3. should
各个条件有一个满足即可,即各条件是or的关系
POST /moe_db/_doc/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"name": "admin"
}
},
{
"term": {
"age": 30
}
}
]
}
}
}
复制代码
4. must_not
不满足所有条件,即各条件是not的关系
POST /moe_db/_doc/_search
{
"query": {
"bool": {
"must_not": [
{
"term": {
"name": "xxoo"
}
}
]
}
}
}
复制代码
5. filter
不计算相关度评分,它不计算_score即相关度评分,效率更高
POST /moe_db/_doc/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"name": "admin"
}
}
]
}
}
}
复制代码
三、文档映射
ElasticSearch mapping文档映射分为静态映射和动态映射。
- 静态映射:创建文档时,指定各个字段的type类型、分词规则、是否存储。
- 动态映射:创建文档时,不指定各个字段的type类型,ES会根据个字段值进行默认创建和分词。
1. 动态映射
1.1 创建索引
PUT /moe_db
复制代码
1.2 删除索引
DELETE /moe_db
复制代码
1.3 创建文档
PUT /moe_db/_doc/7
{
"name": "admin moe",
"sex": 1,
"age": 18,
"address": "某区",
"remark": "xxx"
}
复制代码
1.4 查询文档映射
静态映射和动态映射都通过_mapping
查询文档映射信息。
GET /moe_db/_mapping
复制代码
2. 静态映射
设置文档映射
PUT /moe_db
{
"mappings": {
"properties": {
"name": {
"type": "keyword",
"index": true,
"store": true
},
"sex": {
"type": "integer",
"index": true,
"store": true
},
"age": {
"type": "integer",
"index": true,
"store": true
},
"address": {
"type": "text",
"index": true,
"store": true
},
"remark": {
"type": "text",
"index": true,
"store": true
}
}
}
}
复制代码
四、核心类型
在创建文档映射时,需要指定那些字段是什么类型,是否需要分词,是否索引及存储等信息,就需要了解都有哪些类型。
-
字符串
- text
会对文本进行分词,不能用来排序和聚合。
- keyword
不会对文本进行分词,不会模糊匹配,只会精准查询(取决于什么分词器),可以被用来检索过滤,排序和聚合。
-
数值型
- long
- integer
- short
- byte
- double
- float
-
日期型
- date
-
布尔型
- boolean
五、mapping 举例
1. 设置ik分词器
PUT /moe_db
{
"mappings": {
"properties": {
"name": {
"type": "keyword",
"index": true,
"store": true
},
"sex": {
"type": "integer",
"index": true,
"store": true
},
"age": {
"type": "integer",
"index": true,
"store": true
},
"remark": {
"type": "text",
"index": true,
"store": true,
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
},
"address": {
"type": "text",
"index": true,
"store": true
}
}
}
}
复制代码
2. mapping 修改
ES不能对已存在的mapping修改(比如修改字段类型等等),只能重新创建新的静态索引,把之前索引里的数据导入到新的索引里,删除旧的索引,再为新的索引重命名为原索引名,有点类似于关系型数据库中表的rename。
六、总结
本篇介绍了ElasticSearch中的单条件查询、多条件查询语法的使用,以及ES中文档映射(mapping)需要注意的点,实际需求中需要根据背景来分析字段类型是什么类型,是keyword还是text类型,就看是否需要分词。
欢迎大家关注微信公众号(MarkZoe)互相学习、互相交流。
近期评论