美文网首页
elasticsearch学习(二)

elasticsearch学习(二)

作者: 那就省略号吧 | 来源:发表于2020-08-12 16:57 被阅读0次

    倒排索引

    elasticsearch(以下简称‘es’)是一个基于Lucene的搜索服务器,而Lucene是基于倒排索引实现的。倒排索引是源于实际应用中需要通过属性值来找对应的记录,即通过关键词来找出包含该关键词的文档,通过索引表建立关键词和包含该关键词文档地址的关系表。因为不是通过文档来确定关键词,而是通过关键词来定位文档,所以称之为倒排索引。

    es名词解释

    es 解释
    index 索引,相对于MySQL中的库(database)的概念
    Type 索引类型,一个索引下有多个类型,对应MySQL的表(table)
    Document 文档,存储于es中的一个json文件,相当于MySQL表中的行(row),具有一个类型和一个Id
    Id 标识,相对于MySQL中表的主键,用于定位文档,每个文档必须具有主键,如果没提供将自动生成
    Field 字段,相对于MySQL为表字段(Column)
    Mapping 映射在一个关系型数据库里面,schema定义了表、每个表的字段,还有表和字段之间的关系。 与之对应的,在ES中:Mapping定义索引下的Type的字段处理规则,即索引如何建立、索引类型、是否保存原始索引JSON文档、是否压缩原始JSON文档、是否需要分词处理、如何进行分词处理等
    Node 节点,属于es集群的运行实例
    Primary shard 主分片,文档存储于主分片上,当你索引一个文档时,索引首先生成在主分片上,然后才到主分片的所有副本上。默认情况下,索引有5个主分片。您可以指定更多或更少的主分片来适应索引可以处理的文档数。一旦创建了索引,就不能改变索引中主分片的数量
    Replica shard 副分片,一个主分片具有多个副分片,它的作用主要当主分片出现问题时,可以提升为主分片,还有用于分担主分片上的搜索,提升性能

    elasticsearch+kibana学习

    • 示例

    图片.png
    • 名词解释

    {
      "took" : 8, #整个搜索请求花费多少毫秒
      "timed_out" : false, #搜索是否超时,false-未超时,true-超时
      "_shards" : {  #分片,一个搜索请求会发送到一个index上的所有主分片下,当主分片存在副分片,则也有可能路由到副分片
        "total" : 1, #总的分片数量
        "successful" : 1, #请求成功的分片数量
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : { 
        "total" : {
          "value" : 2, #查询出来的总的结果数量
          "relation" : "eq"
        },
        "max_score" : 0.9470515, #最高关联分数,本次查询的关键词在文档中关联性越大,分数越高,查询出来的数据就越靠前
        "hits" : [
          {
            "_index" : "index", #索引,相对于关系型数据库的数据库
            "_type" : "test1", #类型,相对于关系型数据库中的表
            "_id" : "1", #主键
            "_score" : 0.9470515, #关联分数值
            "_source" : { #资源数据
              "content" : "里皮是一位牌足够大、支持率足够高的教练"
            },
            "highlight" : { #高亮显示部分
              "content" : [
                "里皮是一位牌足够大、支持率足够高的<span style = 'color:red'>教</span><span style = 'color:red'>练</span>"
              ]
            }
          }
        ]
      }
    }
    
    • 请求方式

    通过kibana对es内数据进行增删改成,es提供了restful接口,主要4种请求方式:
    1.POST : 插入/修改数据
    2.GET : 搜索数据
    3.DELETE : 删除数据
    4.PUT : 插入数据
    通过上述请求方法去定位或插入数据,插入数据的位置通过拼接方式完成:index(索引名称)/type(类型名称)/id(主键名称)(注意:_search:查询所有),如:

    //索引名:shoppingMall,其下有一个类型:goods
    //查询所有数据
    GET _search
    //查询shoppingMall下的所有数据
    GET shoppingMall/_search
    //查询goods下的所有数据
    GET shoppingMall/goods/_search
    //查询goods下的一个商品,主键为:NO123
    GET shoppingMall/goods/NO123
    
    • POST插入数据
      指定要插入的index和type,可以在type后面指定id,不传id会自动生成;当传递id时会判断id是否存在,存在时则修改对应数据,不存在则新增数据
    POST supermark/foods 
    {
      "goodsNO":"NO003",
      "goodsName":"绿茶",
      "desc":"上等绿茶制造"
    }
    
    • PUT插入数据
      使用put进行数据插入时,必须要指定index、type和id,并以'?pretty'结尾,否则会报错,告诉在未指定id时请使用post请求,与post一样,当该id存在时,则修改对应数据,不存在则新增数据
    PUT supermark/foods/qdqqqsDNI0Zv8Rkxq?pretty
    {
      "goodsNO":"NO004",
      "goodsName":"红茶",
      "desc":"上等红茶制造"
    }
    
    • GET获取数据
      使用get请求获取数据,可以获取所有数据,已经指定index下,type下的数据,以'_search'结尾
    GET _search #查询所有数据
    GET supermark/_search  #查询index未supermark的数据
    GET supermark/foods/_search  #查询type为foods的数据
    
    • DELETE删除数据
      使用delete请求必须要指定index、type和id,并以'?pretty'结尾,否则会告知使用post或put进行删除操作
      注意:通过设置:action.disable_delete_all_indices=true,这样会禁止删除所有索引的命令,删除索引的话,必须要给定一个索引 ,稍微安全一些
    //删除索引
    DELETE supermark1 
    DELETE supermark/foods/qdqqqsDNI0Zv8Rkxq?pretty
    //使用post进行数据删除时需要以'_delete_by_query'结尾,需要跟上删除的条件条件语句一下进行说明
    POST supermark/_delete_by_query
    {
      "query":{
        "match": {
          "goodsName": "红"
        }
      }
    }
    
    • 条件语句

    除以上简单的CRUD查询外,还可以跟上条件进行操作,以查询为例:

    • 查询全部:match_all
    GET supermark/foods/_search
    {
      "query":{
        "match_all": {}
      }
    }
    
    • 单条件查询
    • match:将查询条件中关键词进行分词后,模糊匹配查询
    • match_phrase:将查询条件中关键词不进行分词,直接匹配查询
    • term:与match_phrase同,但是在存储时,如果使用了分词,原有的文本会被分词进行存,使用短语查询则查询不到
    • match_phrase_prefix:将查询条件中关键词不进行分词,但是允许最后一个单词进行模糊匹配,适用于英文单词匹配
    • multi_match:搜索多个field中都包含有对应关键词
    //查询desc带有‘上’和‘火’的数据
    GET supermark/foods/_search
    {
      "query":{
        "match": {
          "desc":"上火"
        }
      }
    }
    //查询desc带有‘上火’这个词的数据
    GET supermark/foods/_search
    {
      "query":{
        "match_phrase": {
          "desc":"上火"
        }
      }
    }
    //如果desc使用分词后进行存储,则上火无法查询书数据
    GET supermark/foods/_search
    {
      "query":{
        "term": {
          "desc":"上火"
        }
      }
    }
    //查询desc带有‘like th’这段的数据,如‘like this’,‘like there’等
    GET supermark/foods/_search
    {
      "query":{
        "match_phrase_prefix": {
          "desc":"like th"
        }
      }
    }
    
    • 多条件查询
    • must:必须满足所给条件
    • must_not:与must相反,必须不满足所给条件
    • should:满足所给条件之一即可
    //查询field中goodsName和desc包含了'绿菊'关键词的文档
    GET supermark/foods/_search
    {
      "query":{
        "multi_match": {
          "query":"绿菊",
           "fields":["goodsName","desc"]
        }
      }
    }
    
    //查询goodsName含有'茶','desc'含有'冰'的数据
    GET supermark/foods/_search
    {
      "query":{
        "bool": {
          "must": [
            {
              "match_phrase": {
                "goodsName":"茶"
              }   
            },
            {
              "match": {
                "goodsName":"茶"
              }
            },
            {
              "match": {
                "desc":"冰镇"
              }
            }
          ]
        }
      }
    }
    
    • 指定输出field
    • _source:指定想要输出的field
    //只输出"goodsNO","goodsName"两个字段
    POST supermark/foods/_search
    {
      "query":{
        "match_all": {}
      },
      "_source":["goodsNO","goodsName"]
    }
    
    • 指定排序条件
      sort:指定排序
    GET supermark/foods/_search
    {
      "query":{
        "match_all": {
        }
      },
      "from":0,
      "size":2,
      "sort": [
        {"_score": {"order": "desc"}}, #_score按相关性排序
        {"goodsNO": {"order": "desc"}}
      ]
    }
    

    执行上述方法是,可能会出现以下错误:


    图片.png
    "type": "illegal_argument_exception",
    "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [goodsNO] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
    

    翻译为:默认情况下在文本字段中禁用Field中的数据。在对应的field上设置fielddata=true,通过使倒排索引反转将fielddata加载到内存中,需要注意的是这可能会使用大量内存。
    方法一:可以执行以下语句进行设置对应的field的fielddata=true:

    PUT supermark/_mapping
    {
        "properties": {
            "[对应的filed]": {
                "type":"text",
                "fielddata": true
            }
        }
    }
    

    方法2:查询的field后面带上'.keyword'

    GET supermark/foods/_search
    {
      "query":{
        "match_all": {
        }
      },
      "from":0,
      "size":2,
      "sort": [
        {"goodsName.keyword": {"order": "desc"}},
        {"goodsNO.keyword": {"order": "desc"}}
      ]
    }
    
    • 分页查询
    • from:从第几个开始查询,0为第一个;size:展示的数量
    {
      "query":{
        "match_all": {
        }
      },
      "from":0,
      "size":2
    }
    
    • 过滤操作
      filter:过滤;range:范围;gt:大于,lt:小于,gte:大于等于,lte:小于等于
    GET supermark/foods/_search
    {
      "query": {
        "bool": {
          "must": [
            {
              "match_all": {}
            }
          ],
          "filter": {
            "range": {
              "goodsNO": {
                "gt": 25
              }
            }
          }
        }
      }
    }
    

    上一篇:elasticsearch学习(一)
    下一篇:elasticsearch学习(三)

    相关文章

      网友评论

          本文标题:elasticsearch学习(二)

          本文链接:https://www.haomeiwen.com/subject/aujydktx.html