ElasticSearch 副本-03【ES 索引和文档的基本操作】

Rest 风格说明

Rest 是一种软件架构风格,而不是标准。Reat 只是提供了一组设计原则和约束条件,它主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更加简洁、有层次、易于实现缓存等机制。

基本 Rest 命令说明:

Method URL 地址 描述
GET localhost:9200/索引名称/类型名称/文档ID 根据文档ID查询文档
POST localhost:9200/索引名称/类型名称/_search 查询所有数据
POST localhost:9200/索引名称/类型名称 创建文档(随机文档ID)
PUT localhost:9200/索引名称/类型名称/文档ID 创建文档(指定文档ID)
POST localhost:9200/索引名称/类型名称/文档ID/_update 修改文档
DELETE localhost:9200/索引名称/类型名称/文档ID 删除文档

索引的基本操作

基础测试

1、进入 kibana 的控制台,输入一下命令:

# PUT demo1索引 type1类型 id

PUT /demo1/type1/1
{
  "name": "touyel",		# 属性
  "age": 3			# 属性
}

2、name 这个字段用不用指定字段类呢,毕竟关系型数据库都是需要指定类型的。

官方文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-types.html

  • 字符串类型

    textkeyword

  • 数值类型

    • 整形:byte、short、integer、long
    • 浮点型:float、half_float、scaled_float、double
  • 日期类型

    Date

  • 布尔值类型

    Boolean

  • 二进制类型

    Binary

  • ...

3、指定字段类型

创建索引和规则

PUT /demo2
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "birth": {
        "type": "date"
      }
    }
  }
}

4、获取信息

GET demo2

5、查看默认信息


如果文档没有字段没有指定类型,那么 ElasticSearch 就会默认给我们的字段配置类型。

拓展命令:

通过 GET _cat/ 命令可以获取 ElasticSearch 很多信息。

# 获取健康值
GET _cat/health

GET _cat/indices?v

......

修改

旧办法:直接 PUT 覆盖

PUT /demo3/_doc/1
{
  "name": "二两",
  "age": 18,
  "birth": "2001-01-01"
}

使用 POST 方式修改:

POST /demo3/_doc/1/_update
{
  "doc": {
    "name": "穷鬼二两"
  }
}

最新方式修改(推荐)

POST /demo3/_update/1
{
  "doc": {
    "age": 99
  }
}

删除

通过 DELETE 命令实现删除,根据请求判断是删除索引还是删除文档记录。

删除索引:

DELETE 索引名称

删除文档:

DELETE demo3/_doc/1

文档的基本操作(重点)

基本操作

1、添加数据

PUT /demo5/user/1
{
  "name": "小黑",
  "age": 18,
  "tags": ["温柔", "暖", "乐观"]
}

添加多一点数据....

2、获取数据

简单的搜索,根据ID 查询:

3、更新数据 POST (推荐)

POST /demo5/_update/1
{
  "doc": {
    "name": "黑飞飞"
  }
}


简单的条件查询:

GET demo5/user/_search?q=name:飞

复杂搜索

GET demo5/user/_search
{
  "query": {
    "match": {
      "name": "飞"
    }
  }
}

hits:

索引和文档的信息

查询的结果总数

查润出来的具体文档

通过 score 判断谁更加符合结果

结果过滤:

GET demo5/user/_search
{
  "query": {
    "match": {
      "name": "飞"
    }
  },
  "_source": ["name", "age"]
}

通过特定字段进行排序:

GET demo5/user/_search
{
  "query": {
    "match": {
      "name": "飞"
    }
  },
  "_source": ["name", "age"],
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

分页查询

GET demo5/user/_search
{
  "query": {
    "match": {
      "name": "飞"
    }
  },
  "_source": ["name", "age"],
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ],
  "from": 1,	// 从第几个数据开始
  "size": 1		// 返回多少条数据
}

布尔值查询

GET demo5/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "Jack"
          }
        },
        {
          "match": {
            "age": 22
          }
        }
      ]
    }
  }
}

must ,所有的条件都需要符合才能查询出来。(where id = x and username = xxx)

should,条件符合一个就行。(where id = x or username = xxx)

must_not,指定字段不为某个值。 (not)

过滤器

  • gt 大于
  • get 大于等于
  • lt 小于
  • lte 小于等于

查询 age 大于等于30小于等于50的:

GET demo5/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "name": "飞"
          }
        }
      ],
      "filter": [
        {"range": {
          "age": {
            "gte": 30,
            "lte": 50
          }
        }}
      ]
    }
  }
}

匹配多个条件

多个条件使用空格隔开即可,只要满足其中一个结果就可以查询到,这时候就可以通过 score 进行判断。

GET demo5/user/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "tags": "歌 蹦迪"
          }
        }
      ]
    }
  }
}

精确查询

term 查询是直接通过倒排索引指定的词条进行精确查询的。

关于分词

  • term:直接查询精确的
  • match:会使用分词器解析,然后再查询

两个类型

  • text:可以被分词器解析
  • keyword:不会被分词器解析

前戏:

PUT demo6
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "desc": {
        "type": "keyword"
      }
    }
  }
}

PUT demo6/_doc/1
{
  "name": "touyel",
  "desc": "混子叶"
}

PUT demo6/_doc/2
{
  "name": "黑子",
  "desc": "混子叶的黑子"
}

进行精确查询:

GET demo6/_search
{
  "query": {
    "term": {
      "desc": "混子叶"
    }
  }
}

精确查询多个值

GET demo6/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "desc": "混子叶"
          }
        },
        {
          "term": {
           "desc": "混子叶的黑子"
          }
        }
      ]
    }
  }
}

高亮查询

GET demo5/_search
{
  "query": {
    "match": {
      "name": "飞"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

自定义高亮标签:

GET demo5/_search
{
  "query": {
    "match": {
      "name": "飞"
    }
  },
  "highlight": {
    "pre_tags": "<p class='key'>",
    "post_tags": "</p>",
    "fields": {
      "name": {}
    }
  }
}

小结

匹配:

  • 按条件匹配
  • 精确匹配
  • 区间范围匹配
  • 匹配字段过滤
  • 多条件查询
  • 倒排索引
  • 高亮查询

猜你喜欢

转载自www.cnblogs.com/touyel/p/12760128.html