文档章节

Elasticsearch 快速上手

Yeamo
 Yeamo
发布于 2016/12/08 15:28
字数 1498
阅读 46
收藏 2
点赞 0
评论 0

本文目的是为了让不了解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上有很多干货,建议大家使用前可以通读一遍。

 

 

© 著作权归作者所有

共有 人打赏支持
Yeamo
粉丝 0
博文 2
码字总数 6132
作品 0
东城
程序员
快速上手 Elasticsearch 的几个建议

相信不少同学都听说过 Elasticsearch,作为目前最流行的搜索引擎实现方案,越来越多的公司在自己的架构中引入,而其应用场景也从搜索引擎扩展到了日志存储分析、大数据分析领域,本文尝试给初...

rockybean
05/21
0
0
Elasticsearch笔记(一)—Elasticsearch安装配置

一、安装Elasticsearch ·安装Elasticsearch唯一的要求是安装官方新版的Java,地址:http://www.java.com/ ·java安装配置:http://jingyan.baidu.com/article/e75aca85b29c3b142edac6a8.htm...

j_hao104
2016/03/22
0
3
Java搜索引擎选择: Elasticsearch与Solr(转)

Elasticsearch简介 Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。 它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组...

easonjim
2017/11/13
0
0
当ES赶超Redis,这份ES进修攻略不容错过!

从4月DB-Engines最新发布的全球数据库排名中,我们赫然发现ElasticSearch逆袭超越了Redis,从原先的第9名上升至第8名,而Redis则落后一名,排在了其后。 事实上,这场逆袭并不算太让人意外。...

DBAplus社群
04/15
0
0
使用logstash+elasticsearch+kibana快速搭建日志平台

日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日志详情 监控系统的运行状况 统计分析,比如接口的调用次数、执行时间...

eddy_linux
2015/11/13
0
0
OpenStack 日志搜集分析之 ELK

ELK 安装配置简单,用于管理 OpenStack 日志时需注意两点: Logstash 配置文件的编写 Elasticsearch 日志存储空间的容量规划 另外推荐 ELKstack 中文指南。 ELK 简介 ELK 是一套优秀的日志搜...

koala bear
2015/08/14
0
0
Centos6搭建elk系统,监控IIS日志

**所需程序: 服务器端:java、elasticsearch、kikbana 客 户 端:IIS、logstash** 一、服务器端(192.168.10.46)操作: 先建立一个ELK专门的目录: [root@Cent65 ~]mkdir /elk/ 上传到elk...

D杀手D
04/24
0
0
bboss elasticsearch v5.0.7.8 发布

The best elasticsearch highlevel java rest api-----bboss bboss elasticsearch v5.0.7.8发布 功能改进 1.新增spring boot starter模块,全面支持spring boot starter风格,支持单ES集群和......

bboss
06/27
0
0
简单安装ELK分析日志及使用心得

ELK是由Elasticsearch、Logstash、Kibana三个组件组成的。 Elasticsearch:是ELK的核心插件,是一个基于Lucene的搜索服务器,它提供一个分布式多用户能力的全文搜索引擎,能够达到实时搜索,...

狼叔LSF
06/10
0
0
elasticsearch-head 安装介绍

elasticsearch-head 是用于监控 Elasticsearch 状态的客户端插件,包括数据可视化、执行增删改查操作等。elasticsearch-head 插件的安装在 Linux 和 Windows 没什么区别,安装之前确保当前系...

BeckJin
05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Kafka设计解析(一)- Kafka背景及架构介绍

原创文章,转载请务必将下面这段话置于文章开头处。(已授权InfoQ中文站发布) 本文转发自技术世界,原文链接 http://www.jasongj.com/2015/03/10/KafkaColumn1 摘要   Kafka是由LinkedI...

mskk
10分钟前
0
0
使用Service Mesh整合您的微服务架构

在微服务架构的世界中,它正在达到这样的程度,即管理系统的复杂性对于利用它带来的好处变得至关重要。 目前,如何实现这些微服务不再是一个问题,因为有很多可用的框架(Spring Boot,Vert....

xiaomin0322
13分钟前
0
0
看看 LinkedList Java 9

终于迎来了 LinkedList 类,实现的接口就有点多了 Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>。LinkedList是一个实现了List接口和Deque接口的双端链......

woshixin
31分钟前
0
0
算法 - 冒泡排序 C++

大家好,我是ChungZH。今天我给大家讲一下最基础的排序算法:冒泡排序(BubbleSort)。 冒泡排序算法的原理如下: 比较相邻的元素。如果第一个比第二个大(可以相反),就交换他们两个。 对每...

ChungZH
34分钟前
0
0
jquery ajax request payload和fromData请求方式

请求头的不同 fromData var data = { name : 'yiifaa'};// 提交数据$.ajax('app/', { method:'POST', // 将数据编码为表单模式 contentType:'application/x-ww...

lsy999
36分钟前
0
0
阿里P7架构师,带你点亮程序员蜕变之路

前言: Java是现阶段中国互联网公司中,覆盖度最广的研发语言。 掌握了Java技术体系,不管在成熟的大公司,快速发展的公司,还是创业阶段的公司,都能有立足之地。 有不少朋友问,成为Java架...

Java大蜗牛
38分钟前
1
0
Ecstore 在没有后台管理界面(维护)的情况如何更新表的字段

window 系统: 切换到:app\base 目录下: C:\Users\qimh>d: D:\>cd D:\WWW\huaqh\app\base 执行:D:\WWW\huaqh\app\base>cmd update linux 系统: 1># cd /alidata/www.novoeshop.com/app/......

qimh
42分钟前
0
0
设计模式-策略模式

策略模式 解释 对工厂模式的再次封装,使用参数控制上下文信息(将工厂返回的实例赋值给context field) 不会返回bean实例,只是设置对应的条件 调用context的方法(调用field的方法) 用户只...

郭里奥
45分钟前
0
0
python使用有序字典

python自带的collections包中有很多有用的数据结构可供使用,其中有个叫OrderedDict类,它可以在使用的时候记录元素插入顺序,在遍历使用的时候就可以按照原顺序遍历。 a = {"a":1,"b"...

芝麻糖人
今天
0
0
RestTemplate HttpMessageConverter

RestTemplate 微信接口 text/plain HttpMessageConverter

微小宝
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部