5月14号学习笔记

ES权威指南学习@TOC

基础入门:为了搜索

一个ES集群可以包含多个索引,相应的每个索引可以包含多个类型。这些不同的类型存储着多个文档,每个文档又有多个属性。

索引做名词讲类似 于是数据库,索引做动词讲:索引一个文档就是存储一个文档到一个索引。

索引雇员文档:
PUT /megacorp/employee/1
{
“first_name” : “John”,
“last_name” : “Smith”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}

无需进行执行管理任务,如创建一个索引或指定每个属性的数据类型之类的,可以直接只索引一个文档,ES会默认完成其他一切

检索文档

执行一个HTTP GET请求并指定文档的地址–索引库、类型和ID。使用这三个信息就可以返回原始的JSON文档
GET /megacorp/employee/1
返回结果包括了文档的一些元数据,以及_source属性,
{
“_index” : “megacorp”,
“_type” : “employee”,
“_id” : “1”,
“_version” : 1,
“found” : true,
“_source” : {
“first_name” : “John”,
“last_name” : “Smith”,
“age” : 25,
“about” : “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}
}

轻量搜索

搜索所有雇员
GET /megacorp/employee/_search
返回结果包括了所有文档。放在数组hits中。一个搜索默认返回十条结果
{
“took”: 6,
“timed_out”: false,
“_shards”: { … },
“hits”: {
“total”: 3,
“max_score”: 1,
“hits”: [
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “3”,
“_score”: 1,
“_source”: {
“first_name”: “Douglas”,
“last_name”: “Fir”,
“age”: 35,
“about”: “I like to build cabinets”,
“interests”: [ “forestry” ]
}
},
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “1”,
“_score”: 1,
“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}
},
{
“_index”: “megacorp”,
“_type”: “employee”,
“_id”: “2”,
“_score”: 1,
“_source”: {
“first_name”: “Jane”,
“last_name”: “Smith”,
“age”: 32,
“about”: “I like to collect rock albums”,
“interests”: [ “music” ]
}
}
]
}
}
注意:显示搜索结果给最终用户所需要的全部信息

搜索姓氏为“Smith”的雇员,使用高亮搜索,涉及到一个查询字符串(query-string)搜索。我们通过一个URL参数来传递查询接口给搜索接口
GET /megacorp/employee/_search?q=last_name:Smith
返回结果给出了所有的Smith
{

“hits”: {
“total”: 2,
“max_score”: 0.30685282,
“hits”: [
{

“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}
},
{

“_source”: {
“first_name”: “Jane”,
“last_name”: “Smith”,
“age”: 32,
“about”: “I like to collect rock albums”,
“interests”: [ “music” ]
}
}
]
}
}

使用查询表达式搜索

领域特定语言(DSL),指定了使用一个JSON请求,
查询所有Smith
GET /megecrop/employee/_search
{
“query”:{
“match”:{
“last_name”:“Smith”
}
}
}
不再使用qurery-string参数,而是使用JSON请求体,并使用了match查询

更复杂的搜索

搜索姓氏为Smith的雇员,年龄大于30,要使用过滤器filter,他能高效的执行一个结构化查询
GET /megacorp/employee/_search
GET /megacorp/employee/_search
{
“query” : {
“bool”: {
“must”: {
“match” : {
“last_name” : “smith”
}
},
“filter”: {
“range” : {
“age” : { “gt” : 30 }
}
}
}
}
}
这部分是一个range过滤器,能找到年龄大于30的文档,其中gt表示大于(_great than)
返回结果
{

“hits”: {
“total”: 1,
“max_score”: 0.30685282,
“hits”: [
{

“_source”: {
“first_name”: “Jane”,
“last_name”: “Smith”,
“age”: 32,
“about”: “I like to collect rock albums”,
“interests”: [ “music” ]
}
}
]
}
}

全文搜索

单个姓名,通过年龄过滤这种搜索都很简单,尝试高级一点的全文搜索
搜索下所有喜欢攀岩(rock climbing)的雇员:
GET /megacorp/employee/_search
{
“query” : {
“match” : {
“about” : “rock climbing”
}
}
}
返回结果
{

“hits”: {
“total”: 2,
“max_score”: 0.16273327,
“hits”: [
{

“_score”: 0.16273327,
“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}
},
{

“_score”: 0.016878016,
“_source”: {
“first_name”: “Jane”,
“last_name”: “Smith”,
“age”: 32,
“about”: “I like to collect rock albums”,
“interests”: [ “music” ]
}
}
]
}
}
es按照默认相关性得分排序(_score),即每个文档跟查询的匹配程度
第一个明显更匹配,所以排在前面
这个案例表明:es是如何在全文属性上搜索并返回相关性最强的结果,相关性是es区别传统关系型数据库的一个概念,传统关系型数据库一条记录要么匹配要么不匹配。

短语搜索

找出独立的单词好找(就像上面那样)但是有时候想要精确匹配一系列单词或者短语,比如仅匹配同时包含“rock”“climbing”,并且两者是以短语“rock climbing”的形式
使用match_phrase查询
GET /megacorp/employee/_search
{
“query” : {
“match_phrase” : {
“about” : “rock climbing”
}
}
}

返回结果只有一个了
{

“hits”: {
“total”: 1,
“max_score”: 0.23013961,
“hits”: [
{

“_score”: 0.23013961,
“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
}
}
]
}
}

高亮搜索

许多应用都倾向于在每个搜索结果中高亮出部分文本片段,以便让用户知道为什么该文档符合查询条件
GET /megacorp/employee/_search
{
“query” : {
“match_phrase” : {
“about” : “rock climbing”
}
},
“highlight”: {
“fields” : {
“about” : {}
}
}
}
返回结果
{

“hits”: {
“total”: 1,
“max_score”: 0.23013961,
“hits”: [
{

“_score”: 0.23013961,
“_source”: {
“first_name”: “John”,
“last_name”: “Smith”,
“age”: 25,
“about”: “I love to go rock climbing”,
“interests”: [ “sports”, “music” ]
},
“highlight”: {
“about”: [
“I love to go rock climbing
]
}
}
]
}
}

分析

es有一个功能叫聚合(aggretions),允许我们基于数据生成一些精细的分析结果,
例如挖掘雇员中最受欢迎的兴趣爱好
GET /megacorp/employee/_search
{
“aggs”: {
“all_interests”: {
“terms”: { “field”: “interests” }
}
}
}
返回结果
{

“hits”: { … },
“aggregations”: {
“all_interests”: {
“buckets”: [
{
“key”: “music”,
“doc_count”: 2
},
{
“key”: “forestry”,
“doc_count”: 1
},
{
“key”: “sports”,
“doc_count”: 1
}
]
}
}
}
可知两位员工对音乐感兴趣,一位对林地感兴趣,一位对运动感兴趣。这些聚合并非预先统计,而是从匹配当前查询的文档中即使生成。

ES的分布式特性

es尽可能屏蔽了分布式系统的复杂性,一些在后台自动执行的操作。
1、分配文档到不同的容器或分片中,文档可以储存在一个或多个节点中
2、按集群节点来均衡分配这些分片,从而对索引和搜索过程进行负载均衡
3、复制每个分片以支持数据冗余,从而防止硬件故障导致的数据丢失
4、将集群中任一节点的请求路由到存有相关数据的节点
5、集群扩容时无缝整合新节点,重新分配分片以便从离群点恢复

基础入门:集群内原理

ElasticSearch 的主旨是随时可用和按需扩容。 而扩容可以通过购买性能更强大( 垂直扩容 ,或 纵向扩容 ) 或者数量更多的服务器( 水平扩容 ,或 横向扩容 )来实现。

虽然 Elasticsearch 可以获益于更强大的硬件设备,但是垂直扩容是有极限的。 真正的扩容能力是来自于水平扩容–为集群添加更多的节点,并且将负载压力和稳定性分散到这些节点中。

对于大多数的数据库而言,通常需要对应用程序进行非常大的改动,才能利用上横向扩容的新增资源。 与之相反的是,ElastiSearch天生就是 分布式的 ,它知道如何通过管理多节点来提高扩容性和可用性。 这也意味着你的应用无需关注这个问题

每一个分片都是一个功能完整的搜索引擎

基础入门:数据输入和输出

在es中,每个字段的所有数据都是默认被索引的,即每个字段都有为了快速检索设置的专用倒排索引,而且不像其他多数数据库,他能在同一个查询中使用所有这些倒排索引,并以惊人的速度返回结果。

在es中,文档有特定的含义,它是指最顶层或者根对象,这个根对象被序列化为JSON并存储到es中,指定了唯一ID
一个文档不仅仅包含它的数据。也包含元数据–有关文档的信息。
_index
文档在哪存放
_type
文档表示的对象类别
_id
文档的唯一标识

5月15日

删除文档不会立即将文档从磁盘中删除,只是将文档标记为已删除状态,随着不断的索引更多的数据,es将会在后台清理标记为已删除的文档。

处理冲突

在数据库领域,有两种方法被用来确保并发更新时变更不会丢失
悲观并发控制:
假定有变更冲突可能发生,因阻塞访问资源以防止冲突。一个典型的例子时读取一行数据之之前先把其锁住,确保只有放置锁的线程能够对这行数据进行修改。
乐观并发控制
假设冲突不可能发生,并且不会阻塞正在尝试的操作,然而如果源数据在读写当中被修改,更新将会失败。可以重新尝试更新。

即使有文档没有被检索到,上述请求的HTTP状态码仍是200,事实上,即使请求没有找到任何文档,他的状态码仍是200,因为mget本身已经成功执行,为了确认某个文档查找是否成功或者失败,需要检查found标记。

在分布式系统中深度分页·是有问题的
假设在一个有5个主分片的索引中搜索,当我们请求结果的第一页(结果从1到10),每一个分片产生前10的结果,并且返回给协调节点,协调节点对50个结果排序得到全部结果的前10个
现在假设我们请求第 1000 页–结果从 10001 到 10010 。所有都以相同的方式工作除了每个分片不得不产生前10010个结果以外。 然后协调节点对全部 50050 个结果排序最后丢弃掉这些结果中的 50040 个结果。

可以看到,在分布式系统中,对结果排序的成本随分页的深度成指数上升。这就是 web 搜索引擎对任何查询都不要返回超过 1000 个结果的原因。

倒排索引
你只能搜索在索引中出现的词条,所以索引文本和查询字符串必须变标准化为相同的格式

当我们在 _all 域查询 2014,它匹配所有的12条推文,因为它们都含有2014 :

GET /_search?q=2014 # 12 results

当我们在 _all 域查询 2014-09-15,它首先分析查询字符串,产生匹配201409, 或15 中 任意 词条的查询。这也会匹配所有12条推文,因为它们都含有 2014 :

GET /_search?q=2014-09-15 # 12 results !

当我们在 date 域查询 2014-09-15,它寻找 精确 日期,只找到一个推文:

GET /_search?q=date:2014-09-15 # 1 result

当我们在 date 域查询 2014,它找不到任何文档,因为没有文档含有这个精确日志:

GET /_search?q=date:2014 # 0 results !
date就是加了一个精确域

把kafka中的数据写进es、hbase(调用API)。然后在es中进行查询。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值