elasticsearch学习(二)

倒排索引

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" : [
            "里皮是一位牌足够大、支持率足够高的"
          ]
        }
      }
    ]
  }
}
  • 请求方式

通过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学习(二))