ElasticSearch学习总结

ElasticSearch学习总结

首先是下载安装es,这些官网都有说明,在此不作赘述。安装完之后启动es,我这里是window系统,所以直接在解压目录的bin下面找到elasticsearch双击就行。官方推荐的是用curl来进行es的学习和测试。本人这里用的是postman,因为postman比curl更加强大,它本身也包含有curl。准备工作做到这些,接下来就开始学习:

  • es的基础入门学习

概要:es是面向文档进行存储、检索、聚合等操作的。它是一款分布式全文检索框架,底层基于基于Lucene实现。

存储方面:es是使用 JSON 格式存储数据,属于分布式文档存储,写到磁盘的倒序索引是不变的。es的索引就像是传统数据库中的database。传统数据库是通过增加一个索引(如:B-tree)在指定列上,以便提升检索速度。Elasticsearch使用了一个叫做倒排索引 的结构来达到相同的目的。不过es与传统数据库不同:ES没有用户验证和权限控制;ES没有事务的概念,不支持回滚,误删不能恢复等等。
检索查询方面
空搜索:GET /_search 它简单地返回集群中所有索引下的所有文档。
多搜索、多类型:/_search 在所有的索引中搜索所有的类型;
/gb/_search 在 gb 索引中搜索所有的类型;
/gb,us/_search 在 gb 和 us 索引中搜索所有的文档;
/g*,u*/_search 在任何以 g 或者 u 开头的索引中搜索所有的类型;
/gb/user/_search 在 gb 索引中搜索 user 类型;
/gb,us/user,tweet/_search 在 gb 和 us 索引中搜索 user 和 tweet 类型;
/_all/user,tweet/_search 在所有的索引中搜索 user 和 tweet 类型;
分页:GET /_search?size=?&from=?
size 显示应该返回的结果数量,默认是 10 ; from 显示应该跳过的初始结果数量,默认是 0。
排序:es默认排序是按_soure降序。当然,很多情况下都是自定义排序:1、GET /_search?sort=date:desc/asc date为某一字段。2、直接在body中指定单个或者多个字段,如: “sort”: “number_of_children” 或者
{
“query” : {…},
“sort”: [
{ “date”: { “order”: “desc” }},
{ “_score”: { “order”: “desc” }}
]
}。

索引的概念
1、名词:一个 索引 类似于传统关系数据库中的一个 数据库 ,是一个存储关系型文档的地方。
2、动词:索引一个文档 就是存储一个文档到一个 索引 (名词)中以便被检索和查询。
添加索引:
 PUT  /blogs
 索引在默认情况下会被分配5个主分片,如需自己定义的话,可以在postman的bady中加入:
 {
  "settings" : {
    "number_of_shards" : 3(主分片数量,这个配置在索引创建后不能修改包括默认的。)
    "number_of_replicas" : 1(副分片数量,这个配置可以随时修改。)
  }
}
修改副分片数量:
PUT /my_temp_index/_settings
{
	"number_of_replicas": 1
}
删除索引:
 DELETE /my_index    删除单个索引
 DELETE /index_one,index_two 或者 DELETE /index_*   删除多个索引
 DELETE /_all 或者 DELETE /* 删除所有索引
  • es的深入搜索

搜索功能可以说是es最常用的功能了。搜索一共分为:结构化搜索,全文搜索,多字段搜索和近似匹配、多字段匹配等。关键词有:
布尔过滤器编辑 bool
一个 bool 过滤器由三部分组成:
{
   "bool" : {
      "must" :     [],
      "should" :   [],
      "must_not" : [],
   }
}
must  所有的语句都 必须(must) 匹配,与 AND 等价。
must_not  所有的语句都 不能(must not) 匹配,与 NOT 等价。
should  至少有一个语句要匹配,与 OR 等价。
精准之查找 term,trems:trem用于查询单个精确值,trems用于查询多个精确值。他们都要置于filter中。
查询数字:
 {
"term" : {
    "price" : 20
}
}

查询文本:
{
"query" : {
    "constant_score" : {
        "filter" : {
            "term" : {
                "productID" : "XHDK-A-1293-#fJ3"
            }
        }
    }
}
}

trems查询多个精确值:
{
"query" : {
    "constant_score" : {
        "filter" : {
            "terms" : { 
                "price" : [20, 30]
            }
        }
    }
}
}
模糊查询 fuzzy
{
  "query": {
    "fuzzy": {
      "name":{
        "value": "bird cot",
        "fuzziness": 1
      }
    }
  }
}

1、fuzzy是词/项级别的模糊匹配,match_phrase是基于短语级别的。
2、fuzzy是基于莱文斯坦距离的,所以fuzzy是可以容错的例如你输入"dcg" 你也可以匹配到"dog cat bird",但是这里注意的是你的查询只能是单词条的查询,不能"dcg cat",如果你需要查询短语里面的拼写错误,可以使用match的fuzziness参数,match_phrase是不允许出现不存在的词条的。

范围 range 查询可同时提供包含(inclusive)和不包含(exclusive)这两种范围表达式 。
 gt: > 大于(greater than)
 lt: < 小于(less than)
 gte: >= 大于或等于(greater than or equal to)
 lte: <= 小于或等于(less than or equal to)
 例:
 普通数值范围:
 {
"query" : {
    "constant_score" : {
        "filter" : {
            "range" : {
                "price" : {
                    "gte" : 20,
                    "lt"  : 40
                }
            }
        }
    }
}
}
日期范围:
"range" : {
"timestamp" : {
    "gt" : "2014-01-01 00:00:00",
    "lt" : "2014-01-07 00:00:00"
}
}
字符串范围:
"range" : {
"title" : {
    "gte" : "a",
    "lt" :  "b"
}
}
null值处理(exists、missing):exists相当于sql中的not is null,查询所有非空的值;missing与exists正好相反,相当于sql中的is null,查询空值。
全文检索 match : 匹配查询 match 是个 核心 查询。无论需要查询什么字段, match 查询都应该会是首选的查询方式。它是一个高级 全文查询 ,这表示它既能处理全文字段,又能处理精确字段。这就是说, match 查询主要的应用场景就是进行全文搜索。
 例:使用 match 查询搜索全文字段中的单个词
 {
"query": {
    "match": {
        "title": "QUICK!"
    }
}
}

使用 match 查询搜索全文字段中的多个词
{
"query": {
    "match": {
        "title": "BROWN DOG!"
        "operator": "and"(这里为提高精度指两个词都要同时存在,也可以用or,指两个词存在任意一个即可)
    }
}
}
多条件匹配查询 bool,条件中也可以用boost进行优先级划分,bool默认的boost是1:
  {
  "query": {
    "bool": {
      "should": [
        { "match": { 
            "title":  {
              "query": "War and Peace",
              "boost": 2
        }}},
        { "match": { 
            "author":  {
              "query": "Leo Tolstoy",
              "boost": 2
        }}},
        { "bool":  { 
            "should": [
              { "match": { "translator": "Constance Garnett" }},
              { "match": { "translator": "Louise Maude"      }}
            ]
        }}
      ]
    }
  }
}
短语匹配 match_phrase :就像 match 查询对于标准全文检索是一种最常用的查询一样,当你想找到彼此邻近搜索词的查询方法时,就会想到 match_phrase 查询。
{
    "query": {
        "match_phrase": {
            "title": "quick brown fox"
        }
    }
}
一个被认定为和短语 quick brown fox 匹配的文档,必须满足以下这些要求:
quick 、 brown 和 fox 需要全部出现在域中。
brown 的位置应该比 quick 的位置大 1 。
fox 的位置应该比 quick 的位置大 2 。
如果以上任何一个选项不成立,则该文档不能认定为匹配。
prefix 前缀查询:prefix 查询是一个词级别的底层的查询,它不会在搜索之前分析查询字符串,它假定传入前缀就正是要查找的前缀。
{
"query": {
    "prefix": {
        "postcode": "W1"
    }
}
}

默认状态下, prefix 查询不做相关度评分计算,它只是将所有匹配的文档返回,并为每条结果赋予评分值 1 。它的行为更像是过滤器而不是查询。 prefix 查询和 prefix 过滤器这两者实际的区别就是过滤器是可以被缓存的,而查询不行。

通配符预正则表达式:与 prefix 前缀查询的特性类似, wildcard 通配符查询也是一种底层基于词的查询,与前缀查询不同的是它允许指定匹配的正则式。它使用标准的 shell 通配符查询: ? 匹配任意字符, * 匹配 0 或多个字符。
{
    "query": {
        "wildcard": {
            "postcode": "W?F*HW" 
        }
    }
}
? 匹配 1 和 2 , * 与空格及 7 和 8 匹配。
  • es的聚合

概要:聚合 是由桶和指标组成的。 聚合可能只有一个桶,可能只有一个指标,或者可能两个都有。也有可能有一些桶嵌套在其他桶里面。例如,我们可以通过所属国家来划分文档(桶),然后计算每个国家的平均薪酬(指标)。
  桶(Buckets)满足特定条件的文档的集合
  指标(Metrics)对桶内的文档进行统计计算
  类似于Sql:SELECT COUNT(color) FROM table GROUP BY color 。COUNT(color) 相当于指标。GROUP BY color 相当于桶。

聚合可以与搜索请求同时执行,但是我们需要理解一个新概念: 范围 。 默认情况下,聚合与查询是对同一范围进行操作的,也就是说,聚合是基于我们查询匹配的文档集合进行计算的。
尝试聚合:es5以下的可以依照官方例子做,本人用的是es7,因为fielddata把test类型封装了,所以对于字符串字段,需要加入.keyword,例如"terms" : {“field” : “color.keyword”}。另外,es只有数值类型(integer,long等)的字段才可以进行计算,字符串的不能进行计算。

条形图:
histogram是实现直方图(条形图的关键词)。例:
{
   "size" : 0,
   "aggs":{
      "price":{
         "histogram":{ 
            "field": "price",
            "interval": 20000
         },
         "aggs":{
            "revenue": {
               "sum": { 
                 "field" : "price"
               }
             }
         }
      }
   }
}

histogram 桶要求两个参数:一个数值字段以及一个定义桶大小间隔。sum 度量嵌套在每个售价区间内,用来显示每个区间内的总收入。
按时间统计:date_histogram。虽然通常的 histogram 都是条形图,但 date_histogram 倾向于转换成线状图以展示时间序列。 许多公司用 Elasticsearch 仅仅 只是为了分析时间序列数据。 date_histogram 分析是它们最基本的需要。date_histogram 与 通常的 histogram 类似。 但不是在代表数值范围的数值字段上构建 buckets,而是在时间范围上构建 buckets。 因此每一个 bucket 都被定义成一个特定的日期大小 (比如, 1个月 或 2.5 天 )。
通常的 histogram bucket(桶)是可以处理日期的。 但是它不能自动识别日期。 而用 date_histogram ,你可以指定时间段如 1 个月 ,它能聪明地知道 2 月的天数比 12 月少。 date_histogram 还具有另外一个优势,即能合理地处理时区,这可以使你用客户端的时区进行图标定制,而不是用服务器端时区。通常的 histogram 会把日期看做是数字,这意味着你必须以微秒为单位指明时间间隔。另外聚合并不知道日历时间间隔,使得它对于日期而言几乎没什么用处。
other:聚合还可以加入过滤多桶排序等。因为es用于分布式更多,所以有常用来做近似聚合。这些因为官方文档里都有详细讲解,在此就不再一一赘述。es的学习到此告一段落!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值