ElasticSearch使用入门学习笔记

1、保存数据:

方法一:

Put请求必须带id,如果该id原本没有数据,则为新增操作,如果该id原本有数据,则为更新操作。

Urlhttp://192.168.2.2:9200/索引/类型/id put

方法二:

Post也可以带id,效果与put相同,也可以不带id,则每次都是新增操作,系统会自动给新增的数据分配一个唯一id

Urlhttp://192.168.2.2:9200/索引/类型/id post

2、更新数据

方法一:

通过保存数据的方式都可以做数据更新,但每次更新不会进行数据对比,会直接更新,同时版本号"_version":加一,序列号"_seq_no": 加一。

Urlhttp://192.168.2.2:9200/索引/类型/id put/post

方法二:

通过post请求/_update的方式更新数据,会进行数据对比,如果新旧数据一致,则不会进行更新,版本号"_version"序列号"_seq_no"都不会发生变化,操作的结果"result"为"noop"。

Urlhttp://192.168.2.2:9200/索引/类型/id/_updatepost

请求数据格式:

{

    "doc":{

        "name":"zhanglei",

        "age":24

    }

}

  

3、删除数据

删除单个数据:

Urlhttp://192.168.2.2:9200/索引/类型/id delete

删除索引:

Urlhttp://192.168.2.2:9200/索引 delete

没有删除类型的方法,只能删除索引或者清空类型下的所有数据

4、批量操作

通过kibana操作

 

POST /_bulk
{"delete":{"_index":"website","_type":"blog","_id":"123"}}//删除
{"create":{"_index":"website","_type":"blog","_id":"123"}}//新增
{"title":"my first blog post"}//新增的数据
{"index":{"_index":"website","_type":"blog"}}//新增
{"title":"my second blog post"}//新增的数据
{"update":{"_index":"website","_type":"blog","_id":"123"}}//更新
{"doc":{"title":"my updated blog post"}}//更新的数据

 

ElasticSearch批量操作的各个数据之间相互独立,一条数据的失败并不会影响另一条数据操作的成功,不具有类似数据库操作的事务功能。

 

更新操作中”_retry_on_conflict”表示更新失败后重复操作的次数,当前版本已废弃该功能,无法再使用。

5、查询检索

  1、url形式

    GET bank/_search?q=*&sort=account_number:asc

    q=*表示查询所有

    sort=account_number表示以account_number字段进行排序

    asc表示升序排序(desc表示降序排序)

  2、请求体形式  

GET bank/_search
{
  "query":{                     
    "match_all": {}              //表示查询所有
  },
  "sort":[                      //排序方式
    {
       "account_number":"asc"
    },
    {
      "balance":"desc"
    }
  ],
  "from": 5,                            //从第几个数据开始查询                  
 "size": 5, //查询多少个数据
"_source":[ "account_number","balance","age"] //返回的_source内容(没有指点的内容将不会返回) }

3、精确检索与全文检索

  match:分词匹配

GET bank/_search
{
  "query":{                
    "match": {                //匹配信息
      "address":"Elm"     //匹配address字段的Elm字符
    }
  }
}

 全文检索会按照评分进行排序,会对检索条件进行分词匹配。

  match_phrase:短语匹配

GET bank/_search
{
  "query":{
    "match_phrase": {
      "address": "elm avenue"
    }
  }
}

  与match不同的是,match_phrase会将匹配内容看做一个整体进行匹配,而不会对匹配内容进行分词。

  multi_match:多字段匹配

GET bank/_search
{
  "query": {
    "multi_match": {
      "query": "elm Place ",
      "fields": ["address","city"]
    }
  }
}

  对fields中指定的属性按query指定的字符进行分词匹配。

  bool:用于组合多种匹配方式

GET bank/_search
{
  "query": {
    "bool": {                 //bool用于组合多种匹配方式
      "must": [         //must用于指定必须匹配的内容
        {
          "match": {
            "gender": "m"
          }
        },
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [        //must_not用于指定必须排除的匹配内容
        {"match": {
          "age": "28"
        }}
      ],
      "should": [         //should用于指定希望匹配上的内容,匹配上should指定的内容会获得更高的得分,但如果没有匹配上也可以检索出来
        {"match": {
          "lastname": "hines"
        }}
      ]
    }
  }

  term:完全匹配,不会做分词

GET bank/_search
{
  "query": {
    "term": {
      "address":"road"
    }
  }
}

经过测试,发现:

  1、term对于值为数字的字段进行匹配是完全没有问题的。

  2、term对于单个单词(不含空格)进行匹配也可以,但指定的单个单词不能含有大写字母,这样会匹配到所有该字段值中含有该个单词的数据,大小写字母不影响匹配,但指定单词必须为小写。

  3、无法匹配出含有多个单词的字符。

  建议:只在非字符字段匹配使用term。

  

  keyword:值精确匹配

GET bank/_search
{
  "query": {
    "match": {
      "address.keyword":"263 Aviation Road"
    }
  }
}

  只能匹配到字段值和指定数据完全相同的数据,并且对大小写敏感。

  range:进行区间匹配

  gte:区间匹配的下界

  lte:区间匹配的上界

GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {   
            "age": {     //匹配age字段值在18-28之间的所有数据
              "gte": 18,
              "lte": 28
            }
          }
        }
      ]
    }
  }
}

  filter:过滤,用法和匹配效果和must相同,但通过filter匹配的条件不会进行相关性得分计算

GET bank/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 18,
              "lte": 28
            }
          }
        }
      ]
    }
  }
}

   aggregations聚合分析

GET bank/_search
{
  "query": {
    "match": {
      "address": "mill"    //匹配条件
    }
  },
  "aggs": {
    "ageAggs": {
      "terms": {      //分布分析,根据age属性的分布进行分析,size为分页属性
        "field": "age",
        "size": 10
      }
    },
    "ageAvg":{
      "avg": {        //计算age字段的平均值
        "field": "age"
      }
    },
    "balanceAvg":{
      "avg": {          //计算balance字段的平均值
        "field": "balance"
      }
    }
  }
  , "size": 0          //不显示匹配到的数据,只显示聚合分析信息
}

 

posted on 2020-12-12 22:46  SilenceAries  阅读(103)  评论(0)    收藏  举报

导航