• ES基础知识


    ES本身也是一种数据库(nosql数据库)跟关系数据库存在如下关系

    关系数据库   ES
    database数据库  index索引库
    table表 type类型
    row行 document文档
    column列 field字段

    ES提供的api接口

    method url地址 描述
    PUT  http://*9200/索引名称/类型名称/文档ID  创建文档(指定文档id)
    post  http://*9200/索引名称/类型名称 创建文档(随机文档id)
    post http://*9200/索引名称/类型名称/文档id/_update 修改文档
    delete  http://*9200/索引名称/类型名称/文档ID 删除文档
    get http://*9200/索引名称/类型名称/文档ID 通过文档ID查询
    post http://*9200/索引名称/类型名称/_search 查询所有数据

    数据类型

    字符串:text,keyword

    数值: long,integer,short,byte,double,float,half float,scaled float

    日期类型:date

    布尔类型:boolean

    二进制类型:binary 

    注意:

    text会分词
    keyword:也是字符串,但不会被分词

    ES索引基本操作

    PUT my_index                            #设置索引名称
    {
      "settings": {                         #设置
        "index": {                          #索引
          "number_of_shards":5,             #设置分片数
          "number_of_replicas":1            #设置副本数
        }
      }
    }
    1、设置索引名称

    #获取指定索引的设置信息

    GET my_index/_settings

    #获取所有索引的设置信息

    GET _all/_settings

    #获取多个索引的设置信息

    #GET 索引名称,索引名称/_settings

    GET my_index,my_store/_settings

    PUT /my_index/user/1
    {
      "name":"张三",
      "age": 12
    }
    PUT /test_find/it_job/1
    {
      "post_name":"Java开发攻城狮",
      "address":"北京"
    }
    2、创建索引

    注意:索引名称

    必须是小写

    不能包含:\,/,*, ?, ", <, >, |, (空格),,, #

    在ES7.0以前索引名可以包含冒号,但是7.0之后不支持了

    不能以-,_和+开头

    不能是.或..

    长度不能超过255字节

    #获取整个索引下的数据
    GET /my_index
    ​
    #获取某个文档的数据
    GET /my_index/_doc/1
    ​
    #获取某个文档的数据的某个字段
    GET /my_index/_doc/1?_source=name
    ​
    #只获取文档内容不要元数据
    GET /my_index/_doc/1/_source
    ​
    #查询指定索引的全部信息
    GET /my_index/_search
    3、索引查询
    /_search:在所有的索引中搜索所有的类型
    
    /my_index/_search:在 my_index 索引中搜索所有的类型
    
    /my_index,test_find/_search:在 my_index 和test_find索引中搜索所有的类型
    
    /m*,t*/_search:在所有以m和t开头的索引中所有所有的类型
    
    /my_index/user/_search:在my_index索引中搜索user类型
    
    /my_index,test_find/user,it_job/_search:在my_index和test_find索引上搜索user和it_job类型
    
    /_all/user,it_job/_search:在所有的索引中搜索user和it_job类型
    4、多索引搜索
     #方法一:在原有PUT创建索引时直接进行覆盖操作
    PUT /my_index/user/1
    {
      "name":"朝夕教育-123"
    }
    #缺陷:相当于再次创建没有传入的参数会为空
    ​
    #方法二
    POST /my_index/user/1/_update
    {
      "doc":{
        "name": "朝夕教育-123"
      }
    }
    #没有传入的参数不会为空
    5、索引修改

     6、删除索引

    #根据Id删除指定文档
    DELETE /my_index/user/1


    #删除索引(删除整个索引库)
    DELETE /my_index

    7、复杂操作

    7.1、批量添加数据

    POST /my_index2/_doc/_bulk
    { "index": { "_id": 1 }}
    { "name" : "测试1", "age" :20,"desc":"菜鸟一个","tages":["程序猿","菜鸟","爱学习"] }
    { "index": { "_id": 2 }}
    { "name" : "测试2", "age" :5,"desc":"测试","tages":["程序猿","攻城狮","直男"] }

    bulk批量操作可以在单次API调用中实现多个文档的create、index、update或delete。这可以大大提高索引速度

    bulk请求体如下

    { action: { metadata }}
    { request body }

    action必须是以下几种

    行为 解释
    create 当文档不存在时创建
    index 创建新文档或者替换已有文档
    update 局部更新文档
    delete 删除一个文档

    加入现在要给my_index2的_doc中新增一个文档

    POST _bulk
    {"create": {"_index": "my_index2", "_type": "_doc", "_id": 12}}
    {"name": "test_bulk", "counter":"100"}

    7.2、带条件的简单查询

    GET /my_index2/_doc/_search?q=name:test_bulk

    多个参数用&分开

     7.3、叶子语句

    叶子语句:就像match语句,被用于将查询的字符串与一个字段或多个字段进行对比(单个条件)

    GET /my_index2/_doc/_search
    {
        "query": {
            "match": {
                "name": "test_bulk"
            }
        }
    }
    View Code

    7.4、复合查询

    可以多个查询条件进行合并,比如一个bool语句,允许你在需要的时候组合其他语句,包括mustmust_notshouldfilter语句(多条件组合查询)

    GET /my_index2/_doc/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "name": "张三"
              }
            }
          ],
          "must_not": [
            {
              "match": {
              "age": "5"
            }
            }
          ],
          "should": [
            {
              "match": {
                "desc": ""
              }
            }
          ],
          "filter": {
            "term": {
              "tages": "4561"
            }
          }
        }
      }
    }
    View Code

    说明:

    must:表示文档一定要包含查询的内容

    must_not:表示文档一定不要包含查询的内容

    should:表示如果文档匹配上可以增加文档相关性得分

    事实上我们可以使用两种结构化语句:

    结构化查询query DSL

    用于检查内容与条件是否匹配,内容查询中使用的bool和match字句,用于计算每个文档的匹配得分,元字段_score表示匹配度,查询的结构中以query参数开始来执行内容查询

    结构化过滤Filter DSL

    只是简单的决定文档是否匹配,内容过滤中使用的term和range字句,会过滤 调不匹配的文档,并且不影响计算文档匹配得分

    使用过滤查询会被es自动缓存用来提高效

    8、关键词详解

    8.1、match_all查询
    查询匹配所有文档
    GET /my_index2/_doc/_search
    {
    "query": {
    "match_all": {}
    }
    }

    8.2、match查询
    支持全文搜索和精确查询,取决于字段是否支持全文检索,全文检索会将查询的字符串先进行分词,然后在倒排索引中进行匹配
    精确查询

    GET /my_index2/_doc/_search
    {
    "query": {
    "match": {
    "age": "38"
    }
    }
    }
    对于精确值的查询,可以使用 filter 语句来取代 query,因为 filter 将会被缓存
    operator操作:

    match 查询还可以接受 operator 操作符作为输入参数,默认情况下该操作符是 or 。我们可以将它修改成 and 让所有指定词项都必须匹配
    GET /my_index2/user/_search
    {
    "query": {
    "match": {
    "tages": {
    "query": "程序猿 菜鸟",
    "operator": "and"
    }
    }
    }
    }

    match 查询支持 minimum_should_match 最小匹配参数, 可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字(指需要匹配倒排索引的词的数量),更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量

    GET /my_index2/_doc/_search
    {
      "query": {
        "match": {
          "tages": {
            "query": "程序猿 菜鸟",
            "minimum_should_match": "2"
          }
        }
      }
    }
    View Code

    只会返回匹配上程序猿菜鸟两个词的文档返回,如果minimum_should_match是1,则只要匹配上其中一个词,文档就会返回

    8.3、multi_match查询
    多字段查询,比如查询desc和tages字段包含直的文档

    GET /my_index2/_doc/_search
    {
      "query": {
        "multi_match": {
          "query": "",
          "fields": ["tages","desc"]
        }
      }
    }
    View Code

    8.4、range查询

    范围查询,查询年龄大于6小于60的文档

    GET /my_index2/_doc/_search
    {
      "query": {
        "range": {
          "age": {
            "gt": 6,
            "lt": 60
          }
        }
      }
    }
    View Code

    范围查询操作符

    字符 说明
    gt 大于
    gte 大于等于
    lt 小于
    lte 小于等于

    8.5、term查询

    查询age字段等于38的文档

    GET /my_index2/_doc/_search
    {
      "query": {
        "term": {
          "age": {
            "value": "38"
          }
        }
      }
    }
    View Code

    查询name字段等于“李四”的文档

    查看索引文档,发现存在该文档

     使用如下查询却不能查询出任何信息

    GET /my_index2/_doc/_search
    {
      "query": {
        "term": {
          "name": {
            "value": "李四"
          }
        }
      }
    }
    View Code

    原因分析:term查询会去倒排索引中寻找确切的term,它并不会走分词器,只会去配倒排索引 ,而name字段的type类型是text,会进行分词,将“李四”切分,我们使用term查询“李四”时倒排索引中没有“李四”,所以没有查询到匹配的文档。

    term查询与match查询的区别

    term查询时,不会分词,直接匹配倒排索引
    match查询时会进行分词
    还有一点需要注意,因为term查询不会走分词器,但是会去匹配倒排索引,所以查询的结构就跟分词器如何分词有关系,比如新增一个/my_index2/_doc类型下的文档,name字段赋值为Oppo,这时使用term查询Oppo不会查询出文档,这时因为es默认是用的standard分词器,它在分词后会将单词转成小写输出,所以使用Oppo查不出文档,使用小写oppo可以查出来

    PUT /my_index2/_doc/5
    {
      "title":"Oppo",
      "price":4533.00
    }
    ​GET /my_index2/_doc/_search
    {
      "query": {
        "term": {
          "name": {
            "value": "Oppo" //改成oppo可以查出新添加的文档
          }
        }
      }
    }
    View Code

    8.6、terms查询

    terms查询与term查询一样,但它允许你指定多值进行匹配,如果这个字段包含了指定值中的任何一个值,那么这个文档满足条件

    GET /my_index2/_doc/_search
    {
      "query": {
        "terms": {
          "age": ["5","38"]
        }
      }
    }
    View Code

    8.7、exists 查询

    用于查找那些指定字段中有值 (exists)的文档

    指定name字段有值:

    GET /my_index2/_doc/_search
    {
      "query": {
        "bool": {
          "filter": {
            "exists": {
              "field": "name"
            }
          }
        }
      }
    }
    View Code

    8.8、match_phrase查询

    短语查询,精确匹配,查询攻城狮会匹配tages字段包含攻城狮短语的,而不会进行分词查询,也不会查询出包含攻城xxx狮这样的文档

    GET /my_index2/user/_search
    {
      "query": {
        "match_phrase": {
          "tages": "攻城狮"
        }
      }
    }
    View Code

    8.9、scroll查询

    类似于分页查询,不支持跳页查询,只能一页一页往下查询,scroll查询不是针对实时用户请求,而是针对处理大量数据,例如为了将一个索引的内容重新索引到具有不同配置的新索引中

    POST /my_index2/user/_search?scroll=1m
    {
      "query": {
        "match_all": {}
      },
      "size": 1,
      "from": 0
    }
    //返回值包含一个"_scroll_id" : DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAk-IWcnNUZFJ2cVBTNDZGRnRsRExiZ3Jsdw=="下次查询的时候使用_scroll_id就可以查询下一页的文档
    POST /_search/scroll 
    {
        "scroll" : "1m", 
        "scroll_id" : "DXF1ZXJ5QW5kRmV0Y2gBAAAAAAAAk-IWcnNUZFJ2cVBTNDZGRnRsRExiZ3Jsdw==" 
    }
    View Code

    8.10、fuzzy查询

    模糊查询,fuzzy 查询会计算与关键词的拼写相似程度

    GET /my_index2/_doc/_search
    {
      "query": {
        "fuzzy": {
          "tages":{
            "value": "攻城狮", 
            "fuzziness": 2,
            "prefix_length": 1
          }
        }
      }
    }
    View Code

    参数设置:

    • fuzziness:最大编辑距离,默认为AUTO
    • prefix_length:不会“模糊化”的初始字符数。这有助于减少必须检查的术语数量,默认为0
    • max_expansions:fuzzy查询将扩展到 的最大术语数。默认为50,设置小,有助于优化查询
    • transpositions:是否支持模糊转置(abba),默认是false

    8.11、wildcard查询

    持通配符的模糊查询,?匹配单个字符,*匹配任何字符

    为了防止极其缓慢通配符查询,*?通配符项不应该放在通配符的开始

    GET /my_index2/_doc/_search
    {
      "query": {
        "wildcard": {
          "name": "张*"
        }
      }
    }
    View Code
  • 相关阅读:
    uboot的仓库在哪里?
    git如何查看执行过的历史git命令
    for(;;)和while(true)的区别
    CountDownLatch的理解和使用
    countDownLatch
    websocket @ServerEndpoint(value = "/websocket/{ip}")详解
    Java原子性操作之——Atomic包的原理分析
    CAS原理
    java线程池ThreadPoolExecutor的keepAliveTime=0时,表示超过core线程数的线程在空闲时立即结束!!!
    ThreadPoolExecutor 线程池Demo
  • 原文地址:https://www.cnblogs.com/Duko/p/14843001.html
Copyright © 2020-2023  润新知