Elasticsearch概述

一、概述

        Elasticsearch是一个基于Lucene的开源分布式搜索和分析引擎。它提供了一个高度可扩展的搜索和分析平台,能够处理大规模数据集和实时数据。Elasticsearch的设计目标是快速、灵活和易于使用。

二、优缺点

优点

        分布式:ES采用分布式架构,可以将数据分散存储在多个节点上,提高了系统的可伸缩性和容错性。
        高性能:ES使用倒排索引和分布式搜索算法,可以快速的进行全文搜索和过滤操作,适用于处理大规模的数据集。
        灵活性:ES支持动态数据模型,可以根据需求动态地添加、更新和删除字段,灵活适应不同的数据结构。
        多种查询方式:ES支持丰富的查询语法和查询方式,可以满足各种复杂的搜索需求,包括全文搜索、模糊搜索、聚合分析等。
        实时性:ES具有实时索引和搜索的能力,支持近乎实时的数据查询和分析,适用于实时监控和日志分析等场景。

缺点

        学习门槛高:ES的配置和使用有一定的学习曲线,需要掌握其复杂的查询语法和配置参数。
        依赖于JVM:ES是基于Java开发的,运行时依赖于Java虚拟机,对于非Java开发者可能不太友好。
        数据一致性:ES采用分布式的数据存储和索引,可能存在数据一致性的问题,需要额外的处理机制来保证数据的一致性。
        内存消耗大:由于ES采用倒排索引的方式存储数据,对内存的消耗相对较大,需要配置较高的内存资源。
        不适合事务操作:ES主要用于搜索和分析操作,不适合频繁的事务型操作,如写入、更新和删除等。

三、应用场景

        搜索引擎:Elasticsearch被广泛用于构建搜索引擎,可以快速处理大量的文本数据,并提供强大的搜索和过滤功能。

        日志分析:Elasticsearch可以用于实时处理和分析大量的日志数据。它可以帮助用户快速搜索和过滤日志,以了解系统的性能和运行状况。

        实时数据分析:Elasticsearch支持实时数据索引和分析,可以帮助用户及时了解数据的变化趋势,并做出相应的决策。        

        数据可视化:Elasticsearch可以与Kibana等工具集成,用于创建交互式的数据可视化图表和仪表板,使用户更好地理解数据。

        商业智能:Elasticsearch可以用于构建商业智能应用程序,帮助企业将数据转化为有价值的信息,并支持企业的决策制定过程。

        实时推荐系统:Elasticsearch可以用于构建实时推荐系统,根据用户的偏好和行为推荐相关的内容或产品。

        地理空间分析:Elasticsearch支持地理空间数据索引和查询,可以用于构建地理信息系统和位置服务应用。

四、核心概念

1、分词

        ES(Elasticsearch)中的分词是指将文本按照一定规则切分成单个词语或token的过程。ES内置了多种分词器,可以根据具体需求选择不同的分词器进行分词。

        ES中常用的分词器包括:
 
        Standard分词器:标准分词器会按照空格、标点符号等将文本切分成单个词语。例如,将"Hello, world!"分词为"Hello"和"world"。
 
        Simple分词器:简单分词器只会按照非字母字符将文本进行切分。例如,将"Hello, world!"分词为"hello"、"world"、"!"。
 
        Whitespace分词器:空格分词器会按照空格将文本切分,不会考虑标点符号等。例如,将"Hello, world!"分词为"Hello,"和"world!"。
 
        Keyword分词器:关键字分词器不会对文本进行分词,将整个文本作为一个词语。例如,将"Hello, world!"作为一个词语。
 
        此外,ES还支持自定义分词器,可以根据具体需求自定义分词规则。例如,可以使用正则表达式分词器、nGram分词器等。自定义分词器可通过配置分析器和标记器来实现。
 
        通过设置适当的分词器,可以更好地处理不同类型的文本数据,提高搜索和分析的准确性和效率。
        默认使用的中文分词器是IK Analyzer。IK Analyzer是基于开源项目IK分词器进行开发的一种分词器,它支持细粒度的词汇切分,能够兼顾中文的特点,提供更准确的分词结果。

2、全文检索

        全文检索是一种用于在大规模文本数据中进行搜索的技术。它通过建立索引,将文本中的关键词和词组与其所在的文档位置进行关联,然后通过查询关键词或词组来快速找到包含这些关键词的文档。

        全文检索的主要特点包括:

        检索速度快:通过索引的方式,可以在大规模数据中快速搜索目标文档。
        精确度高:可以根据关键词进行精确匹配,提供相对准确的搜索结果。
        支持多种查询方式:可以进行简单的关键词查询,也可以进行复杂的组合查询,如通配符查询、范围查询等。
        提供排名和排序功能:可以根据相关性对搜索结果进行排序,使得用户更容易找到自己需要的文档。
        支持多语言:可以处理多种语言的文本数据。

        全文检索广泛应用于各种信息检索场景,例如搜索引擎、电子商务网站的商品搜索、文档管理系统的文档搜索等。

3、倒排索引

        倒排索引(Inverted Index)是一种数据结构,用于快速查找包含特定单词的文档或记录。它由两部分组成:词项(Term)和倒排列表(Inverted List)。

        词项是文档中的某个单词或短语,比如“倒排索引”。

        倒排列表是一个包含所有包含该词项的文档或记录的列表。每个文档或记录在列表中都有一个对应的标识符,用于唯一地标识该文档或记录。列表中的每个元素还可以包含其他的信息,如词项在文档中的出现频率、位置等。

        倒排索引的优点是能够快速地定位到包含特定词项的文档或记录,适用于大规模的文本搜索和信息检索场景。它经常被用于搜索引擎和数据库系统中,能够提高搜索效率和准确性。

五、逻辑结构

1、索引(Index)

        索引是文档的集合,类似于关系数据库中的表。每个索引可以包含多个文档,并且每个文档都有一个唯一的ID来标识它。

2、类型(Type)

        类型是索引中的逻辑分类或分组。一个索引可以包含多个类型,每个类型可以定义不同的字段和属性。

3、文档(Document)

        文档是ES中的基本数据单元,它是一个JSON对象,可以包含不同类型和格式的数据。每个文档都有一个唯一的ID来标识它。

4、字段(Field)

        字段是文档中的属性或数据项,类似于关系数据库中的列。字段可以是文本、数字、日期等不同类型的数据。

5、映射(Mapping)

        映射定义了索引中的类型和字段的结构。它指定了每个字段的数据类型、分析器、索引选项等。

六、物理结构

1、节点(Node)

        节点是ES集群的基本单元,节点可以是单个服务器或虚拟服务器。每个节点都是一个独立的ES实例,可以处理数据和执行操作。

2、主节点(Master Node)

        主节点是集群的协调节点,负责管理集群的元数据、索引的创建和删除以及集群的配置等。主节点还负责分配和重新分配分片(Shard)到数据节点。

3、 数据节点(Data Node)

        数据节点存储索引数据和执行搜索操作。每个数据节点都可以存储多个分片,每个分片是索引的一个子集。数据节点还可以执行分布式搜索和聚合操作。

4、协调节点(Coordinating Node)

        协调节点是一个特殊的节点,负责接收客户端请求,并将请求转发给适当的数据节点进行处理。协调节点还负责汇总来自各个数据节点的结果,并将结果返回给客户端。

5、分片(Shard)

        分片是索引的一个子集,每个分片都是一个独立的Lucene索引,包含部分数据和相关的元数据。每个索引可以被分成多个分片,分布在不同的数据节点上。分片的数量可以根据需要进行扩展和收缩。

七、CURL常用命令
 

  创建索引:
    curl -XPUT 'http://localhost:9200/my_index'
  删除索引:
    curl -XDELETE 'http://localhost:9200/my_index'
  插入文档:
    curl -XPOST 'http://localhost:9200/my_index/_doc' -d '{"field1": "value1", "field2": "value2"}'
  更新文档:
    curl -XPOST 'http://localhost:9200/my_index/_doc/1/_update' -d '{"doc": {"field1": "new_value"}}'
  删除文档:
    curl -XDELETE 'http://localhost:9200/my_index/_doc/1'
  搜索文档:
    curl -XGET 'http://localhost:9200/my_index/_search?q=field:value'
  查询集群配置
    curl  http://主机地址:9200/_cat
  查询集群状态
    curl http://主机地址:9200
  查询索引信息
    curl http://主机地址:9200/_search?pretty
    curl -XGET http://主机地址:9200/_cat/indices?v

八、Kibana语法

1、索引操作

# 添加索引,索引单词小写
# 语法结构:PUT 索引名称
PUT shop_index
 
# ES 不支持修改索引
 
# 判断是否有索引,返回值是HTTP的状态码(200:有;404:没有;)
HEAD shop_index
 
# 查询单个索引
# 语法结构:GET 索引名称
GET shop_index
 
# 查询所有的索引
GET _cat/indices
 
# 删除索引
# 语法结构:DELETE 索引名称
DELETE shop_index

2、文档操作

# 添加文档
# 语法结构:PUT 索引名称/_doc/唯一ID
# 唯一ID 为手动创建
PUT shop_index/_doc/1001
{
    "id" : 1001,
    "name" : "TV",
    "price" : 6999
}
 
# 语法结构:POST 索引名称/_doc/
# 唯一ID 为自动创建
POST shop_index/_doc
{
    "id" : 1002,
    "name" : "TV-MI",
    "price" : 3699
}
# 查询文档
# 语法结构:GET 索引名称/_doc/唯一ID
GET shop_index/_doc/1001
 
# 查询当前索引中所有的文档数据
GET shop_index/_search
 
# 删除文档
# 语法结构:DELETE 索引名称/_doc/唯一ID
DELETE shop_index/_doc/1003
# 修改文档,PUT 和 POST 都支持文档存在时修改,不存在时创建。
# 语法结构:PUT 索引名称/_doc/唯一ID
PUT shop_index/_doc/1001
{
    "id" : 1001,
    "name" : "Phone",
    "price" : 6999,
    "type" : "apple"
}
 
# 语法结构:POST 索引名称/_doc/唯一ID
POST shop_index/_doc/1001
{
    "id" : 1001,
    "name" : "Phone",
    "price" : 6999,
    "type" : "mi"
}
# 局部修改文档,仅支持 POST
# 语法结构:POST 索引名称/_update/唯一ID
POST shop_index/_update/1005
{
    "doc":{
        "price": 6599.00
    }
}
 

3、文档检索

# 分词查询
GET shop_index/_search
{
    "query": {
        "match": {
            "name": "米"
        }
    }
}
# 分词查询(等值)
GET shop_index/_search
{
    "query": {
        "match_phrase": {
            "name": "米"
        }
    }
}
# 等值查询(精确)
GET shop_index/_search
{
    "query": {
        "term": {
            "name": {
                "value": "米"
            }
        }
    }
}
# 高亮
GET shop_index/_search
{
    "query": {
        "match": {
            "name": "小米"
        }
    },
    "highlight": {
        "fields": {
            "name": {
                "pre_tags": " <em style='color: green'> ",
                "post_tags": "</ em >"
            },
            “content": {
                "pre_tags": " <em style='color: red'> ",
                "post_tags": "</ em >"
            }
        }
    }
}
# 对查询结构进行限制,展示文档中的某些字段
GET shop_index/_search
{
    "_source": ["price"], 
    "query": {
        "match": {
            "name": "iphone 13"
        }
    }
}
# 组合条件(或者)
GET shop_index/_search
{
    "query": {
        "bool": {
            "should": [
                {
                    "match": {
                        "name": "max"
                    }
                },
                {
                    "match": {
                        "price": 5000
                    }
                }
            ]
        }
    }
}
# 组合条件(并且)
GET shop_index/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "max"
                    }
                },
                {
                    "match": {
                        "price": 9000
                    }
                }
            ]
        }
    }
}
# 范围查询
GET shop_index/_search
{
    "query": {
        "bool": {
            "must": [
                {
                    "match": {
                        "name": "max"
                    }
                }
            ],
            "filter": [
                {
                    "range": {
                        "price": {
                            "gte": 7000,
                            "lte": 10000
                        }
                    }
                }
            ]
        }
    }
}
# 查询结果排序
GET shop_index/_search
{
    "query": {
        "match": {
            "name": "max"
        }
    },
    "sort": [
        {
            "price": {
                "order": "desc"
            }
        }
    ]
}
# 查询结果排序
GET shop_index/_search
{
    "query": {
        "match": {
            "name": "max"
        }
    },
    "sort": [
        {
            "price": {
                "order": "desc"
            }
        }
    ]
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值