ElasticSearch 入门 (二)

前言

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

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

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

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

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

ElasticSearch 入门 (二)
注意运行时,鼠标光标一定要放在你要运行的指令上。


_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 进行查看:

ElasticSearch 入门 (二)

  • 指定索引中各个字段的类型
    字符类型: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

ElasticSearch 入门 (二)

  • 查看所有索引的状态健康情况 分片,数据储存大小等等:
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"
  }
}

状态会更新

ElasticSearch 入门 (二)

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

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

ElasticSearch 入门 (二)

  • 构建查询
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": "<b class='key' style='color:red'>",   // 可以自定义
    "post_tags": "</b>",                               // 可以自定义
    "fields":{
      "name":{}
    }
  }
}

返回结果:

ElasticSearch 入门 (二)

总结:

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

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

上一篇:.Net使用Aspose.Words生成Word文档


下一篇:如何把微信公众号中的图文复制出来