elasticsearch学习(二)

2020-08-12  本文已影响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 supermark/foods 
{
  "goodsNO":"NO003",
  "goodsName":"绿茶",
  "desc":"上等绿茶制造"
}
PUT supermark/foods/qdqqqsDNI0Zv8Rkxq?pretty
{
  "goodsNO":"NO004",
  "goodsName":"红茶",
  "desc":"上等红茶制造"
}
GET _search #查询所有数据
GET supermark/_search  #查询index未supermark的数据
GET supermark/foods/_search  #查询type为foods的数据
//删除索引
DELETE supermark1 
DELETE supermark/foods/qdqqqsDNI0Zv8Rkxq?pretty
//使用post进行数据删除时需要以'_delete_by_query'结尾,需要跟上删除的条件条件语句一下进行说明
POST supermark/_delete_by_query
{
  "query":{
    "match": {
      "goodsName": "红"
    }
  }
}

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

GET supermark/foods/_search
{
  "query":{
    "match_all": {}
  }
}
//查询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"
    }
  }
}
//查询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":"冰镇"
          }
        }
      ]
    }
  }
}
//只输出"goodsNO","goodsName"两个字段
POST supermark/foods/_search
{
  "query":{
    "match_all": {}
  },
  "_source":["goodsNO","goodsName"]
}
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"}}
  ]
}
{
  "query":{
    "match_all": {
    }
  },
  "from":0,
  "size":2
}
GET supermark/foods/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match_all": {}
        }
      ],
      "filter": {
        "range": {
          "goodsNO": {
            "gt": 25
          }
        }
      }
    }
  }
}

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

上一篇下一篇

猜你喜欢

热点阅读