ElasticSearch 及 相关技术

一、ElasticSearch 相关概念

Elasticsearch是⾯向⽂档(document oriented)的,这意味着它可以存储整个对象或⽂档(document)。然 ⽽它不仅仅是存储,还会索引(index)每个⽂档的内容使之可以被搜索。在Elasticsearch中,你可以对⽂ 档(⽽⾮成⾏成列的数据)进⾏索引、搜索、排序、过滤。Elasticsearch⽐传统关系型数据库如下:

Relational DB -> Databases -> Tables -> Rows -> Columns

Elasticsearch -> Indices -> Types -> Documents -> Fields

1.1 关建概念

1.1.1 索引 index

⼀个索引就是⼀个拥有⼏分相似特征的⽂档的集合。⽐如说,你可以有⼀个客户数据的索引,另⼀个产 品⽬录的索引,还有⼀个订单数据的索引。⼀个索引由⼀个名字来标识(必须全部是⼩写字母的),并 且当我们要对对应于这个索引中的⽂档进⾏索引、搜索、更新和删除的时候,都要使⽤到这个名字。在 ⼀个集群中,可以定义任意多的索引。

1.1.2 类型 type

在⼀个索引中,你可以定义⼀种或多种类型。⼀个类型是你的索引的⼀个逻辑上的分类/分区,其语义 完全由你来定。通常,会为具有⼀组共同字段的⽂档定义⼀个类型。⽐如说,我们假设你运营⼀个博客 平台并且将你所有的数据存储到⼀个索引中。在这个索引中,你可以为⽤户数据定义⼀个类型,为博客 数据定义另⼀个类型,当然,也可以为评论数据定义另⼀个类型。

1.1.3 字段Field

相当于是数据表的字段,对⽂档数据根据不同属性进⾏的分类标识

1.1.4 映射 mapping

mapping是处理数据的⽅式和规则⽅⾯做⼀些限制,如某个字段的数据类型、默认值、分析器、是否被 索引等等,这些都是映射⾥⾯可以设置的,其它就是处理es⾥⾯数据的⼀些使⽤规则设置也叫做映射, 按着最优规则处理数据对性能提⾼很⼤,因此才需要建⽴映射,并且需要思考如何建⽴映射才能对性能 更好。

1.1.5 ⽂档 document

⼀个⽂档是⼀个可被索引的基础信息单元。⽐如,你可以拥有某⼀个客户的⽂档,某⼀个产品的⼀个⽂ 档,当然,也可以拥有某个订单的⼀个⽂档。⽂档以JSON(Javascript Object Notation)格式来表⽰, ⽽JSON是⼀个到处存在的互联⽹数据交互格式。 在⼀个index/type⾥⾯,你可以存储任意多的⽂档。注意,尽管⼀个⽂档,物理上存在于⼀个索引之 中,⽂档必须被索引/赋予⼀个索引的type

1.1.6 集群 cluster

⼀个集群就是由⼀个或多个节点组织在⼀起,它们共同持有整个的数据,并⼀起提供索引和搜索功能。 ⼀个集群由⼀个唯⼀的名字标识,这个名字默认就是“elasticsearch”。这个名字是重要的,因为⼀个节 点只能通过指定某个集群的名字,来加⼊这个集群

二 、ElasticSearch的客户端操作

实际开发中,主要有三种⽅式可以作为elasticsearch服务的客户端:

第⼀种,elasticsearch-head插件
第⼆种,使⽤elasticsearch提供的Restful接⼜直接访问
第三种,使⽤elasticsearch提供的API进⾏访问

2.1 elasticsearch-head

2.2 DQL查询 

查询语句是重点。

2.2.1 query_string 查询

请求url:POST 192.168.220.100:9200/blog1/article/_search

请求体:{ "query": { "query_string": { "default_field": "title", "query": "搜索服务器" } } }

2.2.1 term 查询

{ "query": { "term": { "title": "搜索" } } }

两种查询的区别在于:

query_string:搜索之前对搜索的关键词分词

term:对搜索的关键词不分词

三、 IK 分词器 

IKAnalyzer是⼀个开源的,基于java语⾔开发的轻量级的中⽂分词⼯具包。

3.1 安装和配置

安装ik分词器必须和 e s的版本一致否则容易报错, 容器闪退
分词器下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases


将ik分词器上传到服务器上,然后解压,并改名字为ik
unzip elasticsearch-analysis-ik-5.6.8.zip
mv elasticsearch ik

将ik⽬录拷贝到docker容器的plugins⽬录下
docker cp ./ik kkb_es:/usr/share/elasticsearch/plugins

3.2 IK 的分词策略

ik_max_word:会将⽂本做最细粒度的拆分

ik_smart:会做最粗粒度的拆分

四、掌握DSL语句

4.1 索引操作

(1)查询所有索引
GET /_cat/indices?v

(2)删除某个索引
DELETE /skuinfo

(3)新增索引
PUT /user

(4)创建映射

​PUT /user/userinfo/_mapping
{
 "properties": {
 "name":{
 "type": "text",
 "analyzer": "ik_smart",
 "search_analyzer": "ik_smart"
 },
 "city":{
 "type": "text",
 "analyzer": "ik_smart",
 "search_analyzer": "ik_smart"
 },
 "age":{
 "type": "long"
 },
 "description":{
 "type": "text",
 "analyzer": "ik_smart",
 "search_analyzer": "ik_smart"
 }
 }
}

(5)新增文档数据
 

PUT /user/userinfo/1
{
 "name":"李四",
 "age":22,
 "city":"深圳",
 "description":"李四来⾃湖北武汉!"
}

(6)修改数据

a. 替换操作

        更新数据可以使⽤之前的增加操作,这种操作会将整个数据替换掉,代码如下:

#更新数据,id=4
PUT /user/userinfo/4
{
 "name":"张三丰",
 "description":"在武汉读书,家在武汉!在深圳⼯作!"
}

b. 更新数据

#使⽤POST更新某个域的数据
POST /user/userinfo/4/_update
{
 "doc":{
 "name":"张三丰",
 "description":"在武汉读书,家在武汉!在深圳⼯作!"
 }
}

(7)删除document

#删除数据
DELETE user/userinfo/7

4.2 数据查询

(1)查询所有数据

GET /user/_search

(2)根据 id 查询

GET /user/userinfo/2

(3)sort 排序
 

#搜索排序
GET /user/_search
{
 "query":{
 "match_all": {} 
},
 "sort":{
 "age":{
 "order":"desc"
 }
 }
}

(4)分页
 

#分⻚实现
GET /user/_search
{
 "query":{
 "match_all": {}
 },
 "sort":{
 "age":{
 "order":"desc"
 }
 },
 "from": 0,
"size": 2
}

4.3 查询模式

(1)term查询

term主要⽤于分词精确匹配,如字符串、数值、⽇期等(不适合情况:1.列中除英⽂字符外有其它值 2. 字符串值中有冒号或中⽂ 3.系统⾃带属性如_version)

#查询-term
GET _search
{
 "query":{
 "term":{
 "city":"武汉"
 }
 }
}

#查询-terms 允许多个Term
GET _search
{
 "query":{
 "terms":{
 "city":
 [
 "武汉",
 "⼴州"
 ]
 }
 }
}

(2)match查询
 

GET _search
{
 "query": {
 "match": {
 "city": "⼴州武汉"
 }
 }
}

(3)query_string查询

GET _search
{
 "query": {
 "query_string": {
 "default_field": "city",
 "query": "⼴州武汉"
 }
 }
}

(4)range 查询

range过滤允许我们按照指定范围查找⼀批数据。例如我们查询年龄范围

#-range 范围过滤
#gt表示> gte表示=>
#lt表示< lte表示<=
GET _search
{
 "query":{
 "range": {
 "age": {
 "gte": 30,
 "lte": 57
 }
 }
 }
}

(5)exists

exists 过滤可以⽤于查找拥有某个域的数据

GET _search
{
 "query": {
 "exists":{
 "field":"address"
 }
 }
}

(6)bool 查询

bool 可以⽤来合并多个条件查询结果的布尔逻辑,它包含⼀下操作符:

  • must : 多个查询条件的完全匹配,相当于 and。
  • must_not : 多个查询条件的相反匹配,相当于 not。
  • should : ⾄少有⼀个查询条件匹配, 相当于 or。
    GET _search
    {
     "query": {
     "bool": {
     "must": [
     {
     "term": {
     "city": {
     "value": "深圳"
     }
     }
     },
     {
     "range":{
     "age":{
     "gte":20,
     "lte":99
     }
     }
     }
     ]
     }
     }
    }
    
    

    (7)match_all 查询
    可以查询到所有⽂档,是没有查询条件下的默认语句

    #查询所有 match_all
    GET _search
    {
     "query": {
     "match_all": {}
     }
    }

    (8)match查询
    match查询是⼀个标准查询,不管你需要全⽂本查询还是精确查询基本上都要⽤到它。 如果你使⽤ match 查询⼀个全⽂本字段,它会在真正查询之前⽤分析器先分析match⼀下查询字符:

#字符串匹配
GET _search
{
 "query": {
 "match": {
 "description": "武汉"
 }
 }
}

(9) prefix 查询

见名知意

(10))multi_match 查询

multi_match查询允许你做match查询的基础上同时搜索多个字段,在多个字段中同时查⼀个

#多个域匹配搜索
GET _search
{
 "query": {
 "multi_match": {
 "query": "深圳",
 "fields": [
 "city",
 "description"
 ]
 }
 }
}

五、 Spring Data ElasticSearch

 编写实体Article

@Document(indexName = "lxs_blog", type = "article")
public class Article {
 @Id
 @Field(type = FieldType.Long, store = true)
 private long id;
 @Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
 private String title;
 @Field(type = FieldType.Text, store = true, analyzer = "ik_smart")
 private String content;
 
 。。。
}

编写dao

public interface ArticleRepository extends ElasticsearchRepository<Article,Long> {}

        框架中有很多内置方法

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Elasticsearch是一个分布式、高可扩展、实时搜索和分析引擎,它基于Apache Lucene库构建而成。它可以存储、搜索和分析大量的数据,提供了强大的全文搜索功能和实时数据分析能力。 Elasticsearch的工作原理如下: 1. 数据存储:Elasticsearch将数据存储在称为索引的逻辑容器中。索引由一个或多个分片组成,每个分片是一个独立的Lucene索引。 2. 数据索引:当数据被索引时,Elasticsearch会将其分析为倒排索引的形式,以支持快速的全文搜索。倒排索引存储了每个词项(term)与包含该词项的文档之间的映射关系。 3. 分布式搜索:当进行搜索时,Elasticsearch会将搜索请求发送到所有相关分片,并将结果汇总返回给用户。这使得Elasticsearch可以并行处理大量的搜索请求。 4. 实时性能:Elasticsearch提供实时写入和查询性能,当数据被索引后,就可以立即搜索到。 Elasticsearch的应用场景非常广泛,包括但不限于以下几个方面: 1. 全文搜索:Elasticsearch提供了强大的全文搜索功能,可以用于构建各种搜索引擎、电子商务网站等。 2. 日志和事件数据分析:Elasticsearch可以高效地存储和分析大规模的日志数据,帮助用户实时监控系统状态、分析用户行为等。 3. 业务指标监控:Elasticsearch可以用于存储和分析业务指标数据,帮助用户了解业务运营情况、进行数据可视化等。 4. 地理位置搜索:Elasticsearch支持地理位置搜索功能,可以用于构建位置服务、地理信息系统等应用。 5. 分布式数据存储和查询:Elasticsearch的分布式特性使其能够处理大容量数据和高并发查询,适用于构建大规模数据平台。 以上是关于Elasticsearch技术原理及应用演示的简要介绍。如需进一步了解,可以参考相关的官方文档和教程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值