一、ElasticSearch基础概念


1.1 文档和字段:


  ElasticSearch是面向文档(Document)存储的,可以是数据库中的一条商品数据,一个订单信息。文档数据会被序列化为json格式后存储在ElasticSearch中。
  原本数据库中的一行数据就是ES中的一个JSON文档;而数据库中每行数据都包含很多列,这些列就转换为JSON文档中的字段(Field)。

1.2 索引和映射:


  索引(index):相同类型的文档的集合。
  映射(mapping):索引中文档的字段约束信息,类似表的结构约束。

1.3 正向索引和倒排索引:


  什么是正向索引?
    基于文档id创建索引。根据id查询快,但是查询词条时必须先找到文档,而后判断是否包含词条。
  什么是倒排索引?
  对文档内容分词,对词条创建索引,并记录词条所在文档的id。查询时先根据词条查询到文档id,而后根据文档id查询文档。

  ElasticSearch结合kibana、Logstash、Beats,是一整套技术栈,被叫做ELK。被广泛应用在日志数据分析、实时监控等领域。

  二、普通分词器和IK分词器


  倒排索引的关键就是要对文档分词得到词条,然后对词条创建索引。而中文分词往往需要根据语义分析,比较复杂,这就需要用到中文分词器,例如IK分词器。

2.1 默认分词器


  使用默认分词器(标准分词器),会对对中文会一个个字切分,没有中文语义,形成不了有效的词条。
  使用默认分词器:

 

POST /_analyze
{
  "analyzer": "standard",
  "text": "我要去学习java!太棒了!"
}

 


2.2 IK分词器


中文分词器:IK分词器。
IK分词器包含两种模式:

  ik_smart:智能语义切分 。
  ik_max_word:最细粒度切分 。
ik 分词器包含两种模式:
  ik_smart(最大粒度:按照最长的词条进行分词;更适合搜索的时候)。
  ik_max_word(最细粒度:按照最短的词条进行分词,分的词条会比较多;更适合在创建索引的时候使用)。

使用IK分词器:

 

POST /_analyze
{
  "analyzer": "ik_smart",
  "text": "我要去学习java!太棒了!"
}

POST /_analyze
{
  "analyzer": "ik_max_word",
  "text": "我要去学习java!太棒了!"
}

 

 

  分词器的作用是什么?
  创建倒排索引时,对文档分词。用户搜索时,对输入的内容分词。

 

  三、索引库操作


3.1 Mapping映射属性


Mapping是对索引库中文档的约束,常见的Mapping属性包括:

  type:字段数据类型,常见的简单类型有:
    字符串:text(可分词的文本)、keyword(精确值,例如:品牌、国家、ip地址)。
    数值:long、integer、short、byte、double、float。
    布尔:boolean。
    日期:date。
    对象:object。
  index:是否创建索引,默认为true。
  analyzer:使用哪种分词器。
  properties:该字段的子字段。


对应的每个字段映射(Mapping):

ES1-1

 

 


3.2 索引库操作


  Elasticsearch采用的是Restful风格的API,因此其请求方式和路径都比较规范,而且请求参数也都采用JSON风格。我们使用Kibana的DevTools来编写请求。

1. 创建索引库和映射

 

基本语法:

请求方式:PUT
请求路径:/索引库名,可以自定义
请求参数:mapping映射

PUT /testMapping
{
  "mappings": {
    "properties": {
      "info":{
        "type": "text",
        "analyzer": "ik_smart"
      },
      "email":{
        "type": "keyword",
        "index": false
      },
      "name":{
        "properties": {
          "firstName":{
            "type": "keyword"
          },
          "lastName":{
            "type": "keyword"
          }
        }
      }
    }
  }
}

 

 

2. 查询索引库


基本语法:

请求方式:GET
请求路径:/索引库名
请求参数:无


示例:

 

GET /testMapping

 


3. 修改索引库


  倒排索引结构虽然不复杂,但是一旦数据结构改变(比如改变了分词器),就需要重新创建倒排索引。因此索引库一旦创建,无法修改mapping。

  虽然无法修改mapping中已有的字段,但是却允许添加新的字段到mapping中,因为不会对倒排索引产生影响。因此修改索引库能做的就是向索引库中添加新字段,或者更新索引库的基础属性。

示例:

 

#对原有的映射添加域(field)
PUT /testMapping/_mapping
{
  "properties":{
    "age":{
      "type": "integer"
    }
  }
}

 


4. 删除索引库


语法:

请求方式:DELETE
请求路径:/索引库名
请求参数:无
示例:

DELETE /testMapping

 


  四、文档操作


4.1 新增文档


语法:

POST /索引库名/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    "字段3": {
        "子属性1": "值3",
        "子属性2": "值4"
    },
}

 


示例:

 

# 新增文档
POST /testMapper/_doc/1
{
    "info": "IT讲师",
    "email": "zy@163.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

 

 

4.2 查询文档


查询一般都需要条件,这里我们把文档id带上。

语法:

GET /{索引库名称}/_doc/{id}

 


示例:

GET /testMapper/_doc/1

 


4.3 删除文档


删除使用DELETE请求,同样,需要根据id进行删除。

语法:

DELETE /{索引库名}/_doc/id值

 


示例:

 

DELETE /testMapper/_doc/1

 


4.4 修改文档


修改有两种方式:

  全量修改:直接覆盖原来的文档。
  局部修改:修改文档中的部分字段。
1、全量修改

全量修改是覆盖原来的文档,其本质是两步操作:

  根据指定的id删除文档。
  新增一个相同id的文档。
注意:如果根据id删除时,id不存在,第二步的新增也会执行,也就从修改变成了新增操作了。

语法:

PUT /{索引库名}/_doc/文档id
{
    "字段1": "值1",
    "字段2": "值2",
    // ... 略
}

 

 


示例:

 

PUT /testMapper/_doc/1
{
    "info": "IT讲师",
    "email": "zy@163.cn",
    "name": {
        "firstName": "云",
        "lastName": "赵"
    }
}

 

2、 局部修改

局部修改是只修改指定id匹配的文档中的部分字段。

语法:

POST /{索引库名}/_update/文档id
{
    "doc": {
         "字段名": "新的值",
    }
}

 

示例:

 

POST /testMapper/_update/1
{
  "doc":{
    "email":"ZhaoYun@163.cn"
  }
}

 


4.5、文档批处理操作


批处理采用POST请求,基本语法如下:

 

POST _bulk
{ "index" : { "_index" : "test", "_id" : "1" } }
{ "field1" : "value1" }
{ "delete" : { "_index" : "test", "_id" : "2" } }
{ "create" : { "_index" : "test", "_id" : "3" } }
{ "field1" : "value3" }
{ "update" : {"_id" : "1", "_index" : "test"} }
{ "doc" : {"field2" : "value2"} }

 


其中:

  -index代表新增操作:
    _index:指定索引库名。
    _id指定要操作的文档id。
    { “field1” : “value1” }:则是要新增的文档内容。
  -delete代表删除操作:
    _index:指定索引库名。
    _id指定要操作的文档id。
  -update代表更新操作:
    _index:指定索引库名。
    _id指定要操作的文档id。
    { “doc” : {“field2” : “value2”} }:要更新的文档字段。


注意:index 之后的数据要写在一行。

示例,批量新增:

POST /_bulk
{"index":{"_index":"testMapper", "_id":3}}
{"info":"IT讲师", "email":"ww@163.cn","name":{"firstName":"王", "lastName":"五"}}
{"index":{"_index":"testMapper", "_id":4}}
{"info":"IT助教", "email":"zs@163.cn","name":{"firstName":"张", "lastName":"三"}}

 


批量删除:

 

POST /_bulk
{"delete":{"_index":"testMapper", "_id":3}}
{"delete":{"_index":"testMapper", "_id":4}}

 

posted on 2025-11-22 19:58  努力--坚持  阅读(0)  评论(0)    收藏  举报