文档的基本操作
一、添加
添加文档数据
POST /my_doc/_doc/1 -> {索引名}/_doc/{索引ID}(是指索引在es中的id,而不是这条记录的id,比如记录的id从数据库来是1001,并不是这个。如果不写,则自动生成一个字符串。建议和数据id保持一致> )
{
"id": 1001,
"name": "imooc-1",
"desc": "imooc is very good, 慕课网非常牛!",
"create_date": "2019-12-24"
}
{
"id": 1002,
"name": "imooc-2",
"desc": "imooc is fashion, 慕课网非常时尚!",
"create_date": "2019-12-25"
}
{
"id": 1003,
"name": "imooc-3",
"desc": "imooc is niubility, 慕课网很好很强大!",
"create_date": "2019-12-26"
}
{
"id": 1004,
"name": "imooc-4",
"desc": "imooc is good~!",
"create_date": "2019-12-27"
}
{
"id": 1005,
"name": "imooc-5",
"desc": "慕课网 is 强大!",
"create_date": "2019-12-28"
}
{
"id": 1006,
"name": "imooc-6",
"desc": "慕课是一个强大网站!",
"create_date": "2019-12-29"
}
{
"id": 1007,
"name": "imooc-7",
"desc": "慕课网是很牛网站!",
"create_date": "2019-12-30"
}
{
"id": 1008,
"name": "imooc-8",
"desc": "慕课网是很好看!",
"create_date": "2019-12-31"
}
{
"id": 1009,
"name": "imooc-9",
"desc": "在慕课网学习很久!",
"create_date": "2020-01-01"
}
- 注:如果索引没有手动建立mappings,那么当插入文档数据的时候,会根据文档类型自动设置属性类型。这个就是es的动态映射,帮我们在index索引库中去建立数据结构的相关配置信息。
- “fields”: {“type”: “keyword”} 对一个字段设置多种索引模式,使用text类型做全文检索,也可使用keyword类型做聚合和排序
- “ignore_above” : 256 设置字段索引和存储的长度最大值,超过则被忽略
批量添加
POST /imooc-test/_doc/_bulk
{"index":{}}
{"id":1003,"name":"imooc-3","desc":"imoocisniubility,慕课网很好很强大!","create_date":"2019-12-26"}
{"index":{}}
{"id":1004,"name":"imooc-4","desc":"imoocisgood~!","create_date":"2019-12-27"}
{"index":{}}
{"id":1005,"name":"imooc-5","desc":"慕课网is强大!","create_date":"2019-12-28"}
{"index":{}}
{"id":1006,"name":"imooc-6","desc":"慕课是一个强大网站!","create_date":"2019-12-29"}
{"index":{}}
{"id":1007,"name":"imooc-7","desc":"慕课网是很牛网站!","create_date":"2019-12-30"}
{"index":{}}
{"id":1008,"name":"imooc-8","desc":"慕课网是很好看!","create_date":"2019-12-31"}
{"index":{}}
{"id":1009,"name":"imooc-9","desc":"在慕课网学习很久!","create_date":"2020-01-01"}
二、修改删除
删除文档
DELETE /my_doc/_doc/1
- 注:文档删除不是立即删除,文档还是保存在磁盘上,索引增长越来越多,才会把那些曾经标识过删除的,进行清理,从磁盘上移出去。
修改文档
局部
POST /my_doc/_doc/1/_update
{
"doc": {
"name": "123"
}
}
全量替换
PUT /my_doc/_doc/1
{
"id": 1001,
"name": "imooc-1",
"desc": "imooc is very good, 慕课网非常牛!",
"create_date": "2019-12-24"
}
- 注:每次修改后version都会增加
三、查询
查询文档
查询
GET /index_demo/_doc/1
GET /index_demo/_doc/_search
查询结果
{
"_index": "my_doc",
"_type": "_doc",
"_id": "2",
"_score": 1.0,
"_version": 9,
"_source": {
"id": 1002,
"name": "imooc-2",
"desc": "imooc is fashion",
"create_date": "2019-12-25"
}
}
元数据
- _index:文档数据所属那个索引,理解为数据库的某张表即可。
- _id:文档数据的唯一标识,类似数据库中某张表的主键。可以自动生成或者手动指定。
- _score:查询相关度,是否契合用户匹配,分数越高用户的搜索体验越高。
- _version:版本号。
- _source:文档数据,json格式。
定制结果集
GET /index_demo/_doc/1?_source=id,name
GET /index_demo/_doc/_search?_source=id,name
判断文档是否存在
HEAD /index_demo/_doc/1
文档乐观锁控制 if_seq_no与if_primary_term
插入新数据
POST /my_doc/_doc
{
"id": 1010,
"name": "imooc-1010",
"desc": "imoocimooc!",
"create_date": "2019-12-24"
}
# 此时 _version 为 1
修改数据
POST /my_doc/_doc/{_id}/_update
{
"doc": {
"name": "慕课"
}
}
# 此时 _version 为 2
模拟两个客户端操作同一个文档数据,_version都携带为一样的数值
# 操作1
POST /my_doc/_doc/{_id}/_update?if_seq_no={数值}&if_primary_term={数值}
{
"doc": {
"name": "慕课1"
}
}
# 操作2
POST /my_doc/_doc/{_id}/_update?if_seq_no={数值}&if_primary_term={数值}
{
"doc": {
"name": "慕课2"
}
}
版本元数据
- _seq_no:文档版本号,作用同_version(相当于学生编号,每个班级的班主任为学生分配编号,效率要比学校教务处分配来的更加高效,管理起来更方便)
- _seq_no:文档版本号,作用同_version(相当于学生编号,每个班级的班主任为学生分配编号,效率要比学校教务处分配来的更加高效,管理起来更方便)
分词与内置分词器
什么是分词
把文本转换为一个个的单词,分词称之为analysis。es默认只对英文语句做分词,中文不支持,每个中文字都会被拆分为独立的个体。
- 英文分词:I study in
- 中文分词:我在慕课网学习
POST /_analyze
{
"analyzer": "standard",
"text": "text文本"
}
POST /my_doc/_analyze
{
"analyzer": "standard",
"field": "name",
"text": "text文本"
}
es内置分词器
- standard:默认分词,单词会被拆分,大小会转换为小写。
- simple:按照非字母分词。大写转为小写。
- whitespace:按照空格分词。忽略大小写。
- stop:去除无意义单词,比如the/a/an/is
- keyword:不做分词。把整个文本作为一个单独的关键词。
IK中文分词器
下载IK中文分词器
github:https://github.com/medcl/elasticsearch-analysis-ik/releases/
zip解压: unzip xxx.zip -d ik
POST /_analyze
{
"analyzer": "ik_max_word",
"text": "上下班车流量很大"
}
自定义词库
1、 在{es}/plugins/ik/config下,创建:
vim custom.dic
2、 并且添加内容:
呵呵
骚年
3、配置自定义扩展词典
<entry key="ext_dict">custom.dic</entry>
4、重启