ElasticSearch核心语法使用-ES内功修炼第三篇

“这是我参与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)互相学习、互相交流。