ElasticSearch 入门 (二)

ElasticSearch 入门 (二),第1张

ElasticSearch 入门 (二) 前言

上一篇记录了版本、工具以及注意的事项。

这篇就对 ElasticSearch 命令的使用进行记录。

与SpringBoot的整合 请见:ElasticSearch 入门 (三)

在 Kibana 开发工具中学习 ElasticSearch 的命令

链接: http://localhost:5601/app/dev_tools#/console


注意运行时,鼠标光标一定要放在你要运行的指令上。


_doc 为默认的类型。今后好像要取消类型这个东西!!!!

_doc 为默认的类型。今后好像要取消类型这个东西!!!!

_doc 为默认的类型。今后好像要取消类型这个东西!!!!

创建命令

// PUT 创建命令  索引(student)  类型(_doc)  id(1)
PUT /student/_doc/1  
{
  "name":"张三",
  "age":18
}

返回结果:

// 警告信息:不支持在文档索引请求中指定类型
// 而是使用无类型的端点(/{index}/_doc/{id}, /{index}/_doc,或
/{index}/_create/{id})。
{
"_index" : "student",   // 索引
"_type" : "_doc",       // 类型
"_id" : "1",            // id
"_version" : 1,         // 版本
"result" : "created",   //  *** 作类型
"_shards" : {           // 分片信息
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 0,
"_primary_term" : 1
}

可以通过 elasticsearch-head 进行查看:

指定索引中各个字段的类型
字符类型:text 、 keyword

数值类型:long, integer, short, byte, double, flfloat, half_flfloat, scaled_flfloat

日期类型:date

布尔类型:boolean

二进制:binary

指定索引中各个字段的类型:

PUT /student2
{
  "mappings":{
    "properties": {
      "name":{
        "type": "text"
      },
      "age":{
        "type": "long"
      },
      "birthday":{
        "type": "date"
      }
    }
  }
}

查看一下 索引 student2:

GET /student2

查看所有索引的状态健康情况 分片,数据储存大小等等:

GET _cat/indices?v

删除索引:

DELETe /student1
增删改查命令

新增命令

PUT /people/_doc/1
{
  "name":"张三",
  "age":30,
  "desc":"不知道如何形容",
  "tags":["丑男","旅游","交友"]
}

查询命令

GET /people/_doc/1

修改命令
使用 POST 命令,在 id 后面跟 _update ,要修改的内容放到 doc 文档(属性)中即可。

POST /people/_doc/1/_update
{
  "doc":{
    "name":"张三1"
  }
}

状态会更新

条件查询

// 通过 _serarch?q=name:张三 查询条件是name属性有张三的那些数据。
GET /people/_doc/_search?q=name:张三

_score得分,就是根据算法算出和查询条件匹配度高得分就高。

构建查询

GET /people/_doc/_search
{
  "query":{                          // 构建的查询条件
    "match": { 
      "name": "张三"
    }
  },
  "sort":[                           // 排序方式 desc asc
    {
      "age":{
        "order":"desc"
      }
    }],
  "_source":["name","desc","age"],   // 需要展示的属性
  "from":0,                          // 分页参数 from   size
  "size":2 
}

布尔查询
must (and):

// 查询所有 name 属性为“ 张三 “的数据,并且年龄为30岁
GET /people/_doc/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        },
        {
          "match": {
            "age": "30"
          }
        }
        ]
    }
  }
}

我们通过在 bool 属性内使用 must 来作为查询条件!看结果,是不是 有点像 and 的感觉,里面的条件需要都满足!

should (or):

// 查询所有 name 属性为“ 张三 “的数据,或者年龄为30岁
GET /people/_doc/_search
{
  "query":{
    "bool": {
      "should": [
        {
          "match": {
            "name": "张三1"
          }
        },
        {
          "match": {
            "age": "30"
          }
        }
        ]
    }
  }
}

must_not (not): *** 作同理。

Fitter:

// 名字为张三, 25<=年龄<=30
GET /people/_doc/_search
{
  "query":{
    "bool": {
      "must": [
        {
          "match": {
            "name": "张三"
          }
        }
        ],
        "filter": [
          {
            "range": {
              "age": {
                "gte": 25,      // gt 表示大于
                "lte": 30       // gte 表示大于等于
              }                 // lt 表示小于
            }                   // lte 表示小于等于
          }
        ]
    }
  }
}

短语检索

// 标签属性中带有 旅游 和 男  多个用空格隔开
GET /people/_doc/_search
{
  "query":{
    "match": {
      "tags": "旅游 男"
    }
  }
}

term查询精确查询
term和match的区别:

match是经过分析(analyer)的,也就是说,文档是先被分析器处理了,根据不同的分析器,分析出
的结果也会不同,在会根据分词 结果进行匹配。

term是不经过分词的,直接去倒排索引查找精确的值。

PUT testdb
{
  "mappings":{
    "properties":{
      "name":{
        "type":"text" 
      },
       "desc":{
          "type": "keyword"
       }
    }
  }
}  
// 添加数据
PUT testdb/_doc/1
{
  "name": "张三喜爱Java name",
  "desc": "张三喜爱Java desc"
}

上述中testdb索引中,字段name在被查询时会被分析器进行分析后匹配查询。而属于keyword类型不会
被分析器处理。

GET testdb/_search
{
  "query":{
    "term": {
      "name": "张"
    }
  }
}

可以查到信息

{
  "query":{
    "term": {
      "desc": "张"
    }
  }
}

不能查看信息,只能通过 张三喜爱Java desc 作为整体去查。

GET _analyze
{
  "analyzer": "keyword",   // "analyzer": "standard",
  "text": "张三喜爱Java desc" 
}

可以通过上述只能去查看一下具体。

总结:keyword 字段类型不会被分析器分析!

高亮显示

GET /people/_doc/_search
{
  "query":{
    "match": {
      "name": "张三"
    }
  },
  "highlight" :{
    "pre_tags": "",   // 可以自定义
    "post_tags": "",                               // 可以自定义
    "fields":{
      "name":{}
    }
  }
}

返回结果:

总结:

一个索引下面只能创建一个类型就行了,其中各字段都具有唯一性,如果在创建映射的时候,如果没有指定文档类型,那么该索引的默认索引类型是 _doc ,不指定文档id则会内部帮我们生成一个id字符串。

本文参考了网上的资源。如有侵权请联系。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5715814.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)