首页 > 技术文章 > 映射与文档操作

yyyzyyyz 2021-12-16 17:54 原文

四、映射与文档操作

索引创建之后,等于有了关系型数据库中的database。Type相当于关系型数据库的表, 在5.x及以前创建的索引可以有多个Type, 在Elasticsearch 6.x以后创建一个索引只有一个Type,但是仍然兼容以前版本。7.x之后取消了索引type类型的设置,不允许指定类型,默认为_doc,并且不兼容旧版本多个Type。但字段仍然是有的,我们需要设置字段的约束信息,叫做字段映射(mapping)。

1 数据类型

string类型:text,keyword

数字类型:long,integer,short,byte,double,float

日期类型:date

布尔类型:boolean

binary类型:binary

复杂类型:object(实体,对象),nested(列表)

geo类型:geo-point,geo-shape(地理位置)

专业类型:ip,competion(搜索建议)

2 映射参数

属性 描述 适合类型
store 值为yes表示存储,no表示不存储,默认为no all
index yes表示分析,no表示不分析,默认为true text
null_value 如果字段为空,可以设置一个默认值,比如"NA"(传过来为空,不能搜索,na可以搜索) all
analyzer 可以设置索引和搜索时用的分析器,默认使用的是standard分析器,还可以使用whitespace,simple。都是英文分析器 all
include_in_all 默认es为每个文档定义一个特殊域_all,它的作用是让每个字段都被搜索到,如果想让某个字段不被搜索到,可以设置为false all
format 时间格式字符串模式 date

3 创建映射

PUT books
{
  "mappings": {
    "properties":{
      "title":{
        "type":"text",
        "analyzer": "ik_max_word"
      },
      "price":{
        "type":"integer"
      },
      "address":{
        "type":"keyword"
      },
      "company":{
        "properties":{
          "name":{"type":"text"},
          "company_addr":{"type":"text"},
          "employee_count":{"type":"integer"}
        }
      },
      "publish_date":{"type":"date","format":"yyy-MM-dd"}
      
    }
    
  }
}

我们处理中文一般会选择ik分词器ik_max_word

4 插入文档

可以向books/_doc/1插入一条数据(文档)

PUT books/_doc/1
{
  "title":"红楼梦",
  "price":50,  
  "address":"xxxxx",
  "company":{
    "name":"xxxxxx",
    "company_addr":"xxxxxxxxx",
    "employee_count":20
  },
  "publish_date":"2020-08-19"
}

image

插入文档数据不一定要和映射对应,你也可以插入原来没有的字段,这样的话es会自动创建。所以映射可以不创建,插入文档时,会根据字段自动创建。

如果索引也不存在,在插入文档时同样会自动创建一个。比如直接用语句PUT book1111/_doc/1插入文档,会直接创建出book1111的索引,并且自动创建映射。

5 查询文档

查看全部:

#查看books索引的mapping
GET books/_mapping
#获取所有的mapping
GET _all/_mapping

查看某条:

#查询books索引下id为7的文档
GET books/_doc/7
#查询books索引下id为3的文档,只要title字段
GET books/_doc/3?_source=title
#查询books索引下id为6的文档,只要title和price字段
GET books/_doc/6?_source=title,price
#查询books索引下id为6的文档,要全部字段
GET books/_doc/6?_source

除了通过字段查询之外,还可以通过字符串查询。还是使用GET命令,通过_serarch查询,查询条件是price属性是50的书都有哪些。最后,别忘了_search后要加英文分隔符?

# 查询books中price=50的所有字段
GET books/_doc/_search?q=price:50

另外一种是通过DSL语句来进行查询,把?后面的字段,放在括号里查询:

GET books/_doc/_search
{
  "query": {
    "match": {
      "price": 50
    }
  }
}

关于高级查询,后面单独一节介绍。

6 修改文档

#直接覆盖修改 当执行`PUT`命令时,如果数据不存在,则新增该条数据,如果数据存在则修改该条数据。
PUT books/_doc/10
{
  "title":"xxxx",
  "price":333,
  "publish_addr":{
    "province":"黑龙江",
    "city":"福州"
  }
}

#`POST`命令局部修改,这里可用来执行修改操作(还有其他的功能),`POST`命令配合`_update`完成修改操作,指定修改的内容放到`doc`中,必须要放到`doc`里,不能直接修改
POST books/_update/1
{
  "doc":{
    "title":"aaaaa"
  }
}

7 删除文档

# 删除books下id为1的数据
DELETE books/doc/1

推荐阅读