• Elasticsearch(一)基本语法命令


    目录

     

    一、常用操作

    二、索引的基本操作

    1、创建索引 

    2、查询索引 (查询索引规则及其它信息)

    3、修改索引

    方式1(PUT):旧的方式(不推荐)

    方式2(POST):可以只改变部分字段(推荐)

    4、删除索引

    三、文档的基本操作

    1、添加数据

    2、查询数据【简单查询】

    1、查询索引下的全部

    2、根据文档id查询 

    3、条件筛选查询(根据分词拆分规则匹配的)【不建议使用这种写法】

    3、修改数据

    【PUT】方式更新:整体覆盖,也可理解为创建覆盖(不推荐​​​​​​​)

    【POST】方式更新:只更新需要的字段(推荐​​​​​​​)

    4、删除数据

    【POST】方式删除:条件删除 (可支持多条件删除)

    四、文档的复杂查询【重要】

    1、返回数据基本说明 

    2、单字段多个条件匹配(match)

    3、单字段精确匹配(term)

    4、多条件复杂查询(bool)

    5、返回值控制(_source)

    6、查询排序(sort)

    7、查询分页(from、size)

    8、高亮查询结果(highlight)

    五、定义文档规则【重要】

    1、关于分词

    2、查看分词结果(_analyze)

    3、创建文档规则

    1、创建文档(及测试数据)

    2、查询结果案例


    一、常用操作

    Rest风格说明

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

    methodURL地址描述
    PUTlocalhost:9200/索引名称/类型名称/文档id创建文档(指定文档id)
    POSTlocalhost:9200/索引名称/类型名称创建文档(随机文档id)
    POSTlocalhost:9200/索引名称/类型名称/文档id/_update修改文档
    DELETElocalhost:9200/索引名称/类型名称/文档id删除文档
    GETlocalhost:9200/索引名称/类型名称/文档id查询文档-通过文档id
    POSTlocalhost:9200/索引名称/类型名称/文档id/_search查询所有数据

    elasticsearch工具自带命令

    通过命令elasticsearch索引情况!通过 GET_cat/  可以获得es当前的很多信息

    GET _cat/indices?v

    二、索引的基本操作

    1、创建索引 

    1、创建一个索引(同时写入数据)

    PUT /索引名/[类型名]/文档id

    {

    请求体

    }

     执行结果说明

    1. {
    2. "_index" : "test1", //索引名
    3. "_type" : "type", //类型名
    4. "_id" : "1", //id
    5. "_version" : 1, //为1表示没有被更新过(每更新一次会+1)
    6. "result" : "created", //created创建状态
    7. "_shards" : {
    8. "total" : 2,
    9. "successful" : 1,
    10. "failed" : 0
    11. },
    12. "_seq_no" : 0,
    13. "_primary_term" : 1
    14. }

    2、创建一个索引规则(只创建索引和字段,不写入数据)

    其中设置了每个字段的类型 type

     执行结果说明

    1. {
    2. "acknowledged" : true,
    3. "shards_acknowledged" : true, //状态成功
    4. "index" : "test2" //索引名
    5. }

    2、查询索引 (查询索引规则及其它信息)

    GET /索引名 

    获得规则信息,可以通过 GET 请求获取具体的信息

    创建时不指定字段类型

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

    3、修改索引

    方式1(PUT):旧的方式(不推荐)

    PUT /索引名/[类型名]/文档id
    {
      "name":"sally",
      "age":25,
      "birth":"1997-01-05"

    }

    1. PUT /索引名/[类型名]/文档id
    2. {
    3. "name":"sally",
    4. "age":25,
    5. "birth":"1997-01-05"
    6. }

    方式2(POST):可以只改变部分字段(推荐)

    POST /索引名/[类型名]/文档id/_update
    {
      "doc":{
       
    "name":"sally666"
      }
    }

    1. POST /索引名/[类型名]/文档id/_update
    2. {
    3. "doc":{
    4. "name":"sally666"
    5. }
    6. }

    1. PUT /test3/_doc/1
    2. {
    3. "name":"sally",
    4. "age":25,
    5. "birth":"1997-01-05"
    6. }
    7. POST /test3/_doc/1/_update
    8. {
    9. "doc":{
    10. "name":"sally666"
    11. }
    12. }

    4、删除索引

    DELETE /索引名

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

    三、文档的基本操作

    1、添加数据

    PUT /索引名/[类型名]/文档id

    {

    请求体

    }

    1. PUT demo_learn/_doc/1
    2. {
    3. "name":"jerry",
    4. "age":25,
    5. "desc":"会滑板的程序猿",
    6. "tags":["技术大牛","性格好","暖男"]
    7. }
    8. PUT demo_learn/_doc/2
    9. {
    10. "name":"max",
    11. "age":25,
    12. "desc":"实力与幸运并存",
    13. "tags":["技术大牛","性格好","暖男"]
    14. }
    15. PUT demo_learn/_doc/3
    16. {
    17. "name":"jason",
    18. "age":25,
    19. "desc":"灵魂一问",
    20. "tags":["技术大牛","性格好","暖男"]
    21. }

    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" : [
                "技术大牛",
                "性格好",
                "暖男"
              ]
            }
          }
        ]
      }

    1. "hits" : { //索引和文档的信息
    2. "total" : {
    3. "value" : 2, //结果数量
    4. "relation" : "eq"
    5. },
    6. "max_score" : 1.0341108, //文档数据中最大的分值
    7. "hits" : [
    8. {
    9. "_index" : "demo_learn", //索引名
    10. "_type" : "_doc", //文档类型
    11. "_id" : "2", //文档id
    12. "_score" : 1.0341108, //文档数据分值(如果查询结果存在多条,匹配度越高,分值则越高)
    13. "_source" : { //文档数据内容
    14. "name" : "max",
    15. "age" : 25,
    16. "desc" : "实力与幸运并存",
    17. "tags" : [
    18. "技术大牛",
    19. "性格好",
    20. "暖男"
    21. ]
    22. }
    23. },
    24. {
    25. "_index" : "demo_learn",
    26. "_type" : "_doc",
    27. "_id" : "4",
    28. "_score" : 0.542544,
    29. "_source" : {
    30. "name" : "max哈哈哈",
    31. "age" : 25,
    32. "desc" : "实力与幸运并存",
    33. "tags" : [
    34. "技术大牛",
    35. "性格好",
    36. "暖男"
    37. ]
    38. }
    39. }
    40. ]
    41. }

    1、查询索引下的全部

    GET 索引名/_search

    2、根据文档id查询 

    GET 索引名/_doc/文档id

    3、条件筛选查询(根据分词拆分规则匹配的)【不建议使用这种写法】

    GET 索引名/_doc/_search?q=数据名:数据值

    3、修改数据

    【PUT】方式更新:整体覆盖,也可理解为创建覆盖(不推荐​​​​​​​)

    注意:put 在修改时,请求体如果数据少了几个字段(不是全量的数据),会进行整体数据覆盖,那么该字段数据就会被置空(如图二)

    【POST】方式更新:只更新需要的字段(推荐​​​​​​​)

    POST /索引名/[类型名]/文档id/_update
    {
      "doc":{
       
    "需要更新的字段":"内容"
      }
    }

    1. POST /索引名/[类型名]/文档id/_update
    2. {
    3. "doc":{
    4. "需要更新的字段":"内容"
    5. }
    6. }

    4、删除数据

    【POST】方式删除:条件删除 (可支持多条件删除)

    POST /索引名/[类型名]/_delete_by_query

    {
      "query":{
        "match":{

          "查询的字段":"查询内容"
        }
      }
    }

    1. POST /索引名/[类型名]/_delete_by_query
    2. {
    3. "query":{
    4. "match":{
    5. "查询的字段":"查询内容"
    6. }
    7. }
    8. }

    四、文档的复杂查询【重要】

    1、返回数据基本说明 

    1. {
    2. "took" : 0,
    3. "timed_out" : false,
    4. "_shards" : {
    5. "total" : 1,
    6. "successful" : 1,
    7. "skipped" : 0,
    8. "failed" : 0
    9. },
    10. "hits" : {//索引和文档的信息
    11. "total" : {
    12. "value" : 2,//结果数量
    13. "relation" : "eq"
    14. },
    15. "max_score" : 1.0341108,//文档数据中最大的分值
    16. "hits" : [
    17. {
    18. "_index" : "demo_learn_1",//索引名
    19. "_type" : "_doc",//文档类型
    20. "_id" : "3",//文档id
    21. "_score" : 1.0341108,//文档数据分值(如果查询结果存在多条,匹配度越高,分值则越高)
    22. "_source" : {//文档数据内容
    23. "id" : "3",
    24. "name" : "max",
    25. "age" : 25,
    26. "desc" : "实力与幸运并存",
    27. "tags" : [
    28. "技术大牛",
    29. "性格好",
    30. "暖男"
    31. ]
    32. }
    33. },
    34. {
    35. "_index" : "demo_learn_1",
    36. "_type" : "_doc",
    37. "_id" : "4",
    38. "_score" : 0.542544,
    39. "_source" : {
    40. "id" : "4",
    41. "name" : "max哈哈哈",
    42. "age" : 25,
    43. "desc" : "实力与幸运并存",
    44. "tags" : [
    45. "技术大牛",
    46. "性格好",
    47. "暖男"
    48. ]
    49. }
    50. }
    51. ]
    52. }
    53. }

    提前构建一些数据 

    1. PUT demo_learn_1/_doc/1
    2. {
    3. "id" : "1",
    4. "name" : "jerry",
    5. "age" : "28",
    6. "desc" : "会滑板的程序猿,好快乐~~~",
    7. "tags" : [
    8. "技术大牛",
    9. "性格好",
    10. "暖男"
    11. ]
    12. }
    13. PUT demo_learn_1/_doc/2
    14. {
    15. "id" : "2",
    16. "name" : "jason",
    17. "age" : 27,
    18. "desc" : "灵魂一问",
    19. "tags" : [
    20. "技术大牛",
    21. "性格好",
    22. "暖男"
    23. ]
    24. }
    25. PUT demo_learn_1/_doc/3
    26. {
    27. "id" : "3",
    28. "name" : "max",
    29. "age" : 25,
    30. "desc" : "实力与幸运并存",
    31. "tags" : [
    32. "技术大牛",
    33. "性格好",
    34. "暖男"
    35. ]
    36. }
    37. PUT demo_learn_1/_doc/4
    38. {
    39. "id" : "4",
    40. "name" : "max哈哈哈",
    41. "age" : 25,
    42. "desc" : "实力与幸运并存",
    43. "tags" : [
    44. "技术大牛",
    45. "性格好",
    46. "暖男"
    47. ]
    48. }
    49. PUT demo_learn_1/_doc/5
    50. {
    51. "id" : "5",
    52. "name" : "sally",
    53. "age" : 26,
    54. "desc" : "女神",
    55. "tags" : [
    56. "技术大牛",
    57. "性格好",
    58. "村长"
    59. ]
    60. }
    61. PUT demo_learn_1/_doc/6
    62. {
    63. "id" : "6",
    64. "name" : "marvin",
    65. "age" : 24,
    66. "desc" : "哦,雪季的快乐",
    67. "tags" : [
    68. "技术大牛",
    69. "性格好",
    70. "滑雪滑雪"
    71. ]
    72. }

    2、单字段多个条件匹配(match)

    会使用分词器解析匹配 ,先分析文档,然后再通过分析的文档进行查询

    • match 查询词会被分词
    • match_phrase 不会分词
    • match_phrase 可对多个字段进行匹配 

    GET 索引名/_search
    {
      "query":{
        "match":{

          "查询的字段":"查询内容"
        }
      }
    }

    1. GET 索引名/_search
    2. {
    3. "query":{
    4. "match":{
    5. "查询的字段":"查询内容"
    6. }
    7. }
    8. }

    多条件使用空格隔开,只要满足其中一个结果就可以被查出,若有需要此时可以通过分值进行判断

    3、单字段精确匹配(term)

    tram查询直接通过倒排索引指定的词条进行精确查找

    term 代表完全匹配,不进行分词器分析
    term 查询的字段需要在mapping的时候定义好,否则可能词被分词。传入指定的字符串,查不到 

    GET 索引名/_search
    {
      "query": {
        "term": {
         
    "查询的字段":"查询内容"
        }
      }
    }

    1. GET 索引名/_search
    2. {
    3. "query": {
    4. "term": {
    5. "查询的字段":"查询内容"
    6. }
    7. }
    8. }

    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"]
    }

    1. GET 索引名/_search
    2. {
    3. "query": {
    4. "match": {
    5. "查询的字段":"查询内容"
    6. }
    7. },
    8. "_source": ["返回字段1","返回字段2"]
    9. }

    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": {
          "
    字段名": {}
        }
      }
    }

    1. GET demo_learn_1/_search
    2. {
    3. "query": {
    4. "match": {
    5. "查询的字段":"查询内容"
    6. }
    7. },
    8. "highlight": {
    9. "pre_tags": 标签头,
    10. "post_tags": 标签尾,
    11. "fields": {
    12. "字段名": {}
    13. }
    14. }
    15. }

    默认标签

    自定义标签

    五、定义文档规则【重要】

    1、关于分词

    term:直接查询精确的解析(会用到分词器,分词器存在两种情况,text 和 keyword)

    match:会使用分词器解析!(先分析文档,然后再通过分析的文档进行查询)

    两个类型

    • text:会被分词器分析
    • keyword:不会被分词器分析

    2、查看分词结果(_analyze)

    keyword:一个整体,不进行分词分析

    standard:标准分词器

    1. //分词结果(keyword)
    2. GET _analyze
    3. {
    4. "analyzer": "keyword",
    5. "text": ["张三java name"]
    6. }
    7. //分词结果(standard)
    8. GET _analyze
    9. {
    10. "analyzer": "standard",
    11. "text": ["张三java name"]
    12. }

     ​

    3、创建文档规则

    1、创建文档(及测试数据)

    1. # 创建文档规则
    2. PUT demo_learn_2
    3. {
    4. "mappings": {
    5. "properties": {
    6. "name":{ //字段名
    7. "type": "text" //字段类型
    8. },
    9. "desc":{
    10. "type": "keyword"
    11. }
    12. }
    13. }
    14. }
    15. # 创建数据
    16. PUT demo_learn_2/_doc/1
    17. {
    18. "name":"张三java name",
    19. "desc":"张三java desc"
    20. }
    21. PUT demo_learn_2/_doc/2
    22. {
    23. "name":"张三java name2",
    24. "desc":"张三java desc2"
    25. }

    2、查询结果案例

    (1)text类型的检索结果

    字段name的类型定义为text内容被分词解析器解析为多个分词结果,其中一个就是“张”所以可以查到

    (2)keyword类型检索结果

    字段desc的类型定义为keyword内容不会被分词器进行解析

  • 相关阅读:
    DropWizard框架里关于异常统一处理实践
    危!苹果提出上诉,App Store 调整或将推迟数年
    2023年第三届智能制造与自动化前沿国际会议(CFIMA 2023)
    第四节:Vben Admin登录对接后端getUserInfo接口
    【SA8295P 源码分析 (二)】10 - HQX Display(OpenWFD)qcdisplaycfg_ADP_STAR_LA.xml 配置文件解析
    house of husk
    Vue学习之计算属性
    Messari发布Moonbeam简报,每日交易量稳步增长,首次公布利润数据
    张丽俊:穿透不确定性要靠四个“不变”
    SPARK中的wholeStageCodegen全代码生成--以aggregate代码生成为例说起(2)
  • 原文地址:https://blog.csdn.net/fox_bert/article/details/125655866