Elasticsearch 快速上手
博客专区 > Yeamo 的博客 > 博客详情
Elasticsearch 快速上手
Yeamo 发表于1年前
Elasticsearch 快速上手
  • 发表于 1年前
  • 阅读 38
  • 收藏 2
  • 点赞 0
  • 评论 0

新睿云服务器60天免费使用,快来体验!>>>   

本文目的是为了让不了解ES的人尽快的上手使用

一、ES的定义

ES(ElasticSearch)是一个基于Lucene的分布式搜索引擎,支持存储,但不是一个可靠的存储引擎,有丢数据风险。

至于为什么会丢数据,此处不作展开,有兴趣的请移步http://www.hansight.com/blog-elasticsearch-data-loss-scenarios.html

二、ES初识

为了方便大家快速理解,这里我们用mysql来跟ES的一些基本概念做下对比。

  • index > 对应一个mysql库
  • type > 对应一个mysql表
  • document > 对应表里的一条
  • mapping > 对应建库建表语句

既然是跟mysql类比,增删改查自然是少不了,首先我们要有个表,下面这个mapping就是我们的建表语句

{
  "pop_ware": {// 索引:数据库
    "settings": {
      "index": {
        "number_of_shards": "32", // 分片:类似数据库分表
        "number_of_replicas": "2" // 副本:类似于从库
      }
    },
    "mappings": {
      "ware": {// 类似于table
        "_all": {
          "enabled": false
        },
        "_source": {
          "enabled": true
        },
        "_routing": {
          "required": true
        },
        "dynamic": false,
        "properties": {
          "wareId": {
            "type": "long"
          }
          "title": {
            "type": "string",
            "analyzer": "ik"
          },
          "shopName": {
            "type": "string",
            "analyzer": "mmseg_maxword"
          },
          "itemNum": {
            "type": "string",
            "index": "not_analyzed"
          },
          "onlineTime": {
            "type": "date"
          }
        }
      }
    }
  }
}

ES中建表不需要考虑字段长度、约束等一些东西,对它来说,只需要知道字段类型就好。
以下是mapping 的Field datatype

注:已经存在的字段不能被更新和删除

Analyzer

解析是搜索类中间件区别于传统关系型数据库的一项重要能力。简单的说,它会对你输入的查询条件进行解析、拆分、转换、等一系列动作后再去查询,在存储的时候也是这样。

举个例子:

我要查名称是“飞利浦的剃须刀”的商品

上图是指定了IK分词器后,查询条件被分解为多组词,然后ES会根据这些解析后的词进行查询匹配,并按找关联度打分,然后返回排序后的匹配结果。

 

增删改查

ES的API支持http和客户端两种形式,这里我们使用http的方式进行演示。

新增

PUT 'http://localhost:9200/popware/ware/123'
{
    "shopCategoryId": [
      3213,
      65465
    ],
    "title": "飞利浦剃须刀",
    "wareId": 123456789
  }

上面代码新增了一条id为123的商品数据,即一个document。

http请求中,popware是index即mysql中数据库,ware是type即mysql中的表,123可以暂时理解为主键,不能重复,但是又和数据库不一样,ES是以id:document的文件形式存储的,所以当key一样的时候,之前的数据会被覆盖。

查询

GET 'http://localhost:9200/twitter/tweet/123'
{
  "found": true,
  "_index": "pop_ware",
  "_type": "ware",
  "_source": {
    "shopCategoryId": [
      3213,
      65465
    ],
    "title": "飞利浦剃须刀",
    "wareId": 123456789
  },
  "_id": "123",
  "_version": 42
}

上面这一段意思是查询ID为123的商品,http请求的格式跟新增一样,区别是吧put换乘了get。

 

修改

POST 'http://localhost:9200/popware/ware/123/_update'
{"doc":{
    "title": "飞利浦剃须刀"
  }
}

上面的请求意思是更为商品的title字段,可以把它看成是先删除再索引的原子操作,只是省略了返回的过程,这样即减少网络成本

 

删除

DELETE 'http://localhost:9200/popware/ware/123'


三、ES查询

既然是一款搜索引擎,必然有很强大查询功能,下面我们就来简单了解下ES查询相关功能

先混个脸熟,看看这些查询中相关的名词

SearchQueryFilterMatch QueryTerm QueryRange QueryBool QueryFiltered Query

  • search
{
    "_source": false,
    "sort" : [
        { "age" : "desc" }
    ],
    "from" : 0, "size" : 10,
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

搜索相对于query是一个更大的概念,一次搜索主要包含这么几个定义:分页条件、排序、查询。

可以理解为一个select,而query就是where后面那一部分用来筛选的条件。

 

  • query VS filter
{
  "query": { 
    "bool": { 
      "must": [
        { "match": { "title":   "Search"}}, 
      ],
      "filter": [ 
        { "term":  { "status": "published" }}, 
      ]
    }
  }
}

query这个名词在ES中有两层意思:

1、它表示search中的一个查询

2、它表示query上下文,用于区别filter上下文,不在filter内的查询,它就是默认的query上下文。

query默认上下文会对查询的结果进行打分,以影响默认的返回顺序

“这个文档跟查询语句有多匹配?”

filter上下文不会对结果打分

“这个文档跟结果是否匹配?”

谁跑的快?当然filter,并且filter结果会被缓存

  • match VS term

match 一般应用于 query 上下文中,查询的字段一般都是指定分析器(IK,MSEG)的string 类型,

term  精准匹配,适用于除指定了分析器之外的类型

{    
    "term": {
        "status": {
            "value": "A",
            "boost": 2.0 
        }
    }
}

上面这句话的意思是:如果status等于A,权重翻倍

下面是一个terms查询,可以传一个集合,上面说了,ES中每一个字段都可以作为数组来使用,设置多个值,查询也是一样,可以传递多个值

{    
    "terms": {
        "status": [2,3,520]
    }
}
  • range
{
    "range" : {
        "born" : {
            "gte": "01/01/2012",
            "lte": "2013",
            "format": "dd/MM/yyyy||yyyy"
        }
    }
}
  • boolquery  VS filteredquery

    boolquery

组合查询的一种,关键字包含以下四种:

  1. must:必须有  and
  2. filter:必须有  and  不打分   性能好
  3. should:应该有 or
  4. must_not:必须没有  not in  <>

 

    filterdquery

在2.0之前  boolquery是不支持filter的,想用filter只能是以下这种方式:

{
  "filtered": {
    "query": {
      "match": { "tweet": "full text search" }
    },
    "filter": {
      "range": { "created": { "gte": "now-1d/d" }}
    }
  }
}

 


以上就是常用的一些查询功能的用法,公司有ES云服务提供,不需要我们自己搭建,大家可以拿公司的测试环境练练手。

在使用的时候,需要注意查询条件的顺序,尽可能的将匹配结果集少的条件前置,以获取更好的性能。

ES FAQ上有很多干货,建议大家使用前可以通读一遍。

 

 

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 2
码字总数 6132
×
Yeamo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: