目录
1)es拷贝指定索引数据到另一个索引【使用_reindex】
3、条件筛选查询(根据分词拆分规则匹配的)【不建议使用这种写法】
一、常用操作
Rest风格说明
一种软件架构风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。给予这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制
method | URL地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名称/类型名称/文档id | 创建文档(指定文档id) |
POST | localhost:9200/索引名称/类型名称 | 创建文档(随机文档id) |
POST | localhost:9200/索引名称/类型名称/文档id/_update | 修改文档 |
DELETE | localhost:9200/索引名称/类型名称/文档id | 删除文档 |
GET | localhost:9200/索引名称/类型名称/文档id | 查询文档-通过文档id |
POST | localhost:9200/索引名称/类型名称/文档id/_search | 查询所有数据 |
elasticsearch工具自带命令
通过命令elasticsearch索引情况!通过 GET_cat/ 可以获得es当前的很多信息
GET _cat/indices?v
二、索引的基本操作
1、创建索引
1、创建一个索引(同时写入数据)
PUT /索引名/[类型名]/文档id
{
请求体
}
执行结果说明
{
"_index" : "test1", //索引名
"_type" : "type", //类型名
"_id" : "1", //id
"_version" : 1, //为1表示没有被更新过(每更新一次会+1)
"result" : "created", //created创建状态
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}
2、创建一个索引规则(只创建索引和字段,不写入数据)
其中设置了每个字段的类型 type
执行结果说明
{
"acknowledged" : true,
"shards_acknowledged" : true, //状态成功
"index" : "test2" //索引名
}
2、查询索引 (查询索引规则及其它信息)
GET /索引名
获得规则信息,可以通过 GET 请求获取具体的信息
创建时不指定字段类型
如果自己的文档字段没有指定类型,那么ES就会给我们默认配置字段类型
3、修改索引
方式1(PUT):旧的方式(不推荐)
PUT /索引名/[类型名]/文档id
{
"name":"sally",
"age":25,
"birth":"1997-01-05"
}PUT /索引名/[类型名]/文档id { "name":"sally", "age":25, "birth":"1997-01-05" }
方式2(POST):可以只改变部分字段(推荐)
POST /索引名/[类型名]/文档id/_update
{
"doc":{
"name":"sally666"
}
}POST /索引名/[类型名]/文档id/_update { "doc":{ "name":"sally666" } }
PUT /test3/_doc/1
{
"name":"sally",
"age":25,
"birth":"1997-01-05"
}
POST /test3/_doc/1/_update
{
"doc":{
"name":"sally666"
}
}
4、删除索引
DELETE /索引名
通过DELETE 命令实现删除,根据你的请求来判断是删除索引还是删除索引下的文档记录
5、特殊场景操作
1)es拷贝指定索引数据到另一个索引【使用_reindex】
基本步骤
- 确认源索引和目标索引:确定你要从哪个索引拷贝数据(源索引)。确定你要将数据拷贝到哪个索引(目标索引)。如果目标索引不存在,Elasticsearch会在执行_reindex时自动创建它。
- 构建查询条件(可选):如果你只想拷贝部分数据,可以构建一个查询条件来过滤数据。
- 执行_reindex操作:使用_reindex API将数据从源索引拷贝到目标索引。
示例
假设你有一个【源索引source_index】,你想将其所有数据拷贝到一个【新的索引target_index】
使用基本的_reindex
POST _reindex
{
"source": {
"index": "source_index"
},
"dest": {
"index": "target_index"
}
}
2)在已存在索引中增加新字段
PUT /索引名/_mapping/_doc
{
"properties": {
"字段名":{
"type": "字段类型"
}
}
}
PUT /demo_learn/_mapping
{
"properties": {
"dataChangeTime": {
"type": "date"
}
}
}
3)查看es中有哪些索引
在 Elasticsearch 中,查看有哪些索引可以通过使用 REST API 来实现。具体地说,你可以向 Elasticsearch 集群发送一个 GET 请求到 _cat/indices 端点或使用更详细的 GET /_aliases、GET /_mapping 等 API 来获取索引信息。
以下是几种常见的方法:
使用 _cat/indices
这是最简单和最直接的方法来查看所有索引。这个命令会返回所有索引的列表,以及每个索引的一些基本信息,如健康状态、文档数、存储大小等。你可以通过命令行工具如 curl 或直接在 Kibana 的 Dev Tools 中执行以下命令:
GET /_cat/indices
使用 _aliases
如果你想查看索引的别名,这个命令会返回所有索引及其对应的别名信息,可以使用以下命令:
GET /_aliases
使用 _mapping
如果你想查看特定索引的映射信息,将 <index>
替换为你想查看的索引名称。这个命令会返回该索引的映射信息,包括字段类型、分析器等。可以使用以下命令:
GET /<index>/_mapping
4)按条件批量将B字段值赋给A字段
POST /demo_learn/_update_by_query
{
"query": {
"term": {
"dataSources":2
}
},
"script": {
"inline": "ctx._source['A'] = ctx._source['B']"
}
}
三、文档的基本操作
1、添加数据
PUT /索引名/[类型名]/文档id
{
请求体
}
PUT demo_learn/_doc/1
{
"name":"jerry",
"age":25,
"desc":"会滑板的程序猿",
"tags":["技术大牛","性格好","暖男"]
}
PUT demo_learn/_doc/2
{
"name":"max",
"age":25,
"desc":"实力与幸运并存",
"tags":["技术大牛","性格好","暖男"]
}
PUT demo_learn/_doc/3
{
"name":"jason",
"age":25,
"desc":"灵魂一问",
"tags":["技术大牛","性格好","暖男"]
}
2、查询数据【简单查询】
返回数据基本说明【重要】
"hits" : { //索引和文档的信息
"total" : {
"value" : 1, //结果数量
"relation" : "eq"
},
"max_score" : 1.6375021, //文档数据中最大的分值
"hits" : [
{
"_index" : "demo_learn", //索引名
"_type" : "_doc", //文档类型
"_id" : "3", //文档id
"_score" : 1.6375021, //文档数据分值(如果查询结果存在多条,匹配度越高,分值则越高)
"_source" : { //文档数据内容
"name" : "jason",
"age" : 25,
"desc" : "灵魂一问",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
}
]
}
"hits" : { //索引和文档的信息
"total" : {
"value" : 2, //结果数量
"relation" : "eq"
},
"max_score" : 1.0341108, //文档数据中最大的分值
"hits" : [
{
"_index" : "demo_learn", //索引名
"_type" : "_doc", //文档类型
"_id" : "2", //文档id
"_score" : 1.0341108, //文档数据分值(如果查询结果存在多条,匹配度越高,分值则越高)
"_source" : { //文档数据内容
"name" : "max",
"age" : 25,
"desc" : "实力与幸运并存",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
},
{
"_index" : "demo_learn",
"_type" : "_doc",
"_id" : "4",
"_score" : 0.542544,
"_source" : {
"name" : "max哈哈哈",
"age" : 25,
"desc" : "实力与幸运并存",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
}
]
}
1、查询索引下的全部
GET 索引名/_search
2、根据文档id查询
GET 索引名/_doc/文档id
3、条件筛选查询(根据分词拆分规则匹配的)【不建议使用这种写法】
GET 索引名/_doc/_search?q=数据名:数据值
3、修改数据
【PUT】方式更新:整体覆盖,也可理解为创建覆盖(不推荐)
注意:put 在修改时,请求体如果数据少了几个字段(不是全量的数据),会进行整体数据覆盖,那么该字段数据就会被置空(如图二)
【POST】方式更新:只更新需要的字段(推荐)
POST /索引名/[类型名]/文档id/_update
{
"doc":{
"需要更新的字段":"内容"
}
}POST /索引名/[类型名]/文档id/_update { "doc":{ "需要更新的字段":"内容" } }
4、删除数据
【POST】方式删除:条件删除 (可支持多条件删除)
POST /索引名/[类型名]/_delete_by_query
{
"query":{
"match":{"查询的字段":"查询内容"
}
}
}POST /索引名/[类型名]/_delete_by_query { "query":{ "match":{ "查询的字段":"查询内容" } } }
四、文档的复杂查询【重要】
1、返回数据基本说明
{
"took" : 0,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {//索引和文档的信息
"total" : {
"value" : 2,//结果数量
"relation" : "eq"
},
"max_score" : 1.0341108,//文档数据中最大的分值
"hits" : [
{
"_index" : "demo_learn_1",//索引名
"_type" : "_doc",//文档类型
"_id" : "3",//文档id
"_score" : 1.0341108,//文档数据分值(如果查询结果存在多条,匹配度越高,分值则越高)
"_source" : {//文档数据内容
"id" : "3",
"name" : "max",
"age" : 25,
"desc" : "实力与幸运并存",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
},
{
"_index" : "demo_learn_1",
"_type" : "_doc",
"_id" : "4",
"_score" : 0.542544,
"_source" : {
"id" : "4",
"name" : "max哈哈哈",
"age" : 25,
"desc" : "实力与幸运并存",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
}
]
}
}
提前构建一些数据
PUT demo_learn_1/_doc/1
{
"id" : "1",
"name" : "jerry",
"age" : "28",
"desc" : "会滑板的程序猿,好快乐~~~",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
PUT demo_learn_1/_doc/2
{
"id" : "2",
"name" : "jason",
"age" : 27,
"desc" : "灵魂一问",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
PUT demo_learn_1/_doc/3
{
"id" : "3",
"name" : "max",
"age" : 25,
"desc" : "实力与幸运并存",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
PUT demo_learn_1/_doc/4
{
"id" : "4",
"name" : "max哈哈哈",
"age" : 25,
"desc" : "实力与幸运并存",
"tags" : [
"技术大牛",
"性格好",
"暖男"
]
}
PUT demo_learn_1/_doc/5
{
"id" : "5",
"name" : "sally",
"age" : 26,
"desc" : "女神",
"tags" : [
"技术大牛",
"性格好",
"村长"
]
}
PUT demo_learn_1/_doc/6
{
"id" : "6",
"name" : "marvin",
"age" : 24,
"desc" : "哦,雪季的快乐",
"tags" : [
"技术大牛",
"性格好",
"滑雪滑雪"
]
}
2、单字段多个条件匹配(match)
会使用分词器解析匹配 ,先分析文档,然后再通过分析的文档进行查询
- match 查询词会被分词
- match_phrase 不会分词
- match_phrase 可对多个字段进行匹配
GET 索引名/_search
{
"query":{
"match":{"查询的字段":"查询内容"
}
}
}GET 索引名/_search { "query":{ "match":{ "查询的字段":"查询内容" } } }
多条件使用空格隔开,只要满足其中一个结果就可以被查出,若有需要此时可以通过分值进行判断
3、单字段精确匹配(term)
tram查询直接通过倒排索引指定的词条进行精确查找
term 代表完全匹配,不进行分词器分析
term 查询的字段需要在mapping的时候定义好,否则可能词被分词。传入指定的字符串,查不到
GET 索引名/_search
{
"query": {
"term": {
"查询的字段":"查询内容"
}
}
}GET 索引名/_search { "query": { "term": { "查询的字段":"查询内容" } } }
4、多条件复杂查询(bool)
关键字 | 描述 |
---|---|
must(and) | 相当于where 字段名1=值1 and 字段名2=值3 |
must_not(not) | 不等于 |
should(or) | 相当于where 字段名1=值1 or 字段名2=值3 |
filter | 过滤器条件 range:区间 gt:大于 gte:大于等于 lt:小于 lte:小于等于 |
GET 索引名/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"查询的字段":"查询内容"
}
},
{
"match": {
"查询的字段":"查询内容"
}
}
]
}
}
}
GET 索引名/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"查询的字段":"查询内容"
}
},
{
"term": {
"查询的字段":"查询内容"
}
}
],
"should": [
{
"match": {
"查询的字段":"查询内容"
}
}
]
}
}
5、返回值控制(_source)
通过"_source"的方式控制只返回需要的结果
GET 索引名/_search
{
"query": {
"match": {
"查询的字段":"查询内容"
}
},
"_source": ["返回字段1","返回字段2"]
}GET 索引名/_search { "query": { "match": { "查询的字段":"查询内容" } }, "_source": ["返回字段1","返回字段2"] }
6、查询排序(sort)
通过"sort"的方式控制排序
GET 索引名/_search
{
"query": {
"match": {
"查询的字段":"查询内容"
}
},
"sort": [
{
"字段名": {
"order": "desc"
}
}
]
}
7、查询分页(from、size)
通过"from"控制起始行(默认从0开始),"size"控制查几条
同 MySQL 的 limit 相似
GET 索引名/_search
{
"from": 从第几条数据开始,
"size": 查询几条
}
8、高亮查询结果(highlight)
搜索的相关结果可以高亮展示
GET 索引名/_search
{
"query": {
"match": {
"查询的字段":"查询内容"
}
},
"highlight": {
"pre_tags": 标签头,
"post_tags": 标签尾,
"fields": {
"字段名": {}
}
}
}GET demo_learn_1/_search { "query": { "match": { "查询的字段":"查询内容" } }, "highlight": { "pre_tags": 标签头, "post_tags": 标签尾, "fields": { "字段名": {} } } }
默认标签
自定义标签
五、定义文档规则【重要】
1、关于分词
term:直接查询精确的解析(会用到分词器,分词器存在两种情况,text 和 keyword)
match:会使用分词器解析!(先分析文档,然后再通过分析的文档进行查询)
两个类型
- text:会被分词器分析
- keyword:不会被分词器分析
2、查看分词结果(_analyze)
keyword:一个整体,不进行分词分析
standard:标准分词器
//分词结果(keyword)
GET _analyze
{
"analyzer": "keyword",
"text": ["张三java name"]
}
//分词结果(standard)
GET _analyze
{
"analyzer": "standard",
"text": ["张三java name"]
}
3、创建文档规则
1、创建文档(及测试数据)
# 创建文档规则
PUT demo_learn_2
{
"mappings": {
"properties": {
"name":{ //字段名
"type": "text" //字段类型
},
"desc":{
"type": "keyword"
}
}
}
}
# 创建数据
PUT demo_learn_2/_doc/1
{
"name":"张三java name",
"desc":"张三java desc"
}
PUT demo_learn_2/_doc/2
{
"name":"张三java name2",
"desc":"张三java desc2"
}
2、查询结果案例
(1)text类型的检索结果
字段name的类型定义为text,内容被分词解析器解析为多个分词结果,其中一个就是“张”所以可以查到
(2)keyword类型检索结果
字段desc的类型定义为keyword,内容不会被分词器进行解析