ElasticSearch 及 相关技术

ElasticSearch 及 相关技术,第1张


一、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 {}

        框架中有很多内置方法

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/564575.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存