Elasticsearch详解

本文详细介绍了Elasticsearch的八大核心概念,包括索引、文档、字段、类型、映射、分片、集群和节点,以及如何通过示例代码进行数据查询和操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Elasticsearch的使用

ES字段的含义

名称含义对应在mysql中的含义
index索引数据库
type类型
document文档
fields字段

1.索引(Index)
Elasticsearch索引是一组具有共同特征的文档集合。每个索引(index)包含多个类型(type),这些类型依次包含多个文档(document),每个文档包含多个字段(Fields)。在Elasticsearch中索引由多个JSON文档组成。在Elasticsearch集群中可以有多个索引。
在ELK中,当logstash的JSON文档被发送给Elasticsearch时,它们被发送为默认的索引模式“logstash-%{+YYYY.mm.dd}”。它按日划分索引,以便在需要时可以方便地搜索和删除索引。这个模式可以在日志存储的输出插件中改变。

2.文档(document)
Elasticsearch文档是一个存储在索引中的JSON文档。每个文档都有一个类型和对应的ID,这是惟一的。
3.字段(Field)
文档内的一个基本单位,键值对形式(book_name : “learning elk”)

4.类型(Type)
类型用于在索引中提供一个逻辑分区。它基本上表示一类类似类型的文档。一个索引可以有多个类型,我们可以根据上下文来解除它们。

5.映射(Mapping)
映射用于映射文档的每个field及其对应的数据类型,例如字符串、整数、浮点数、双精度数、日期等等。在索引创建过程中,elasticsearch会自动创建一个针对fields的映射,并且根据特定的需求类型,可以很容易地查询或修改这些映射。

6.分片(Shard)
分片是实际的物理实体用于存储每个索引的数据。每个索引都可以有大量的主和复制分片。分片分布在集群中的所有节点中,可以在节点故障或新节点添加时从一个节点移动到另一个节点。

7.主分片(Primary shard)与备份分片(replica shard)
备份分片通常驻留在一个不同的节点上,而不是主碎片,在故障转移和负载平衡的情况下,可以满足多个请求。

8.集群(Cluster)
集群是存储索引数据的节点集合。elasticsearch提供了水平的可伸缩性用以存储集群中的数据。每个集群都由一个集群名称来表示,不同的节点指明集群名称连接在一起。集群名称在elasticsearch.yml中的clustersearch.name的属性设置,它默认为“elasticsearch”:

9.节点(Node)
节点是一个单独运行的elasticsearch实例,它属于一个集群。默认情况下,elasticsearch中的每个节点都加入名为“elasticsearch”的集群。每个节点都可以在elasticsearch中使用自己的elasticsearch.yml,它们可以对内存和资源分配有不同的设置。

语句讲解

  • 根据时间查询的代码:
GET smetrend_date/info/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2018-01-08",
        "lte": "2019-12-12",
        "format": "yyyy-MM-dd"
      }
    }
  }
}
  • 查询前200字频率的出现的次数
POST smetrend_date/info/_search
{
   "size" : 0,  
    "aggs" : {   
        "messages" : {   
            "terms" : {   
               "size" : 100,
              "field" : "text_summary"
            }  
        }  
    }
}
  • 查询前200词频率的出现的次数
GET smetrend_date/info/_search
{
  "size": 0,
  "aggs": {
    "messages": {
      "terms": {
        "size": 200,
        "field": "text_summary",
        "include": "[\u4E00-\u9FA5][\u4E00-\u9FA5]"
      }
    }
  },
  "highlight": {
    "fields": {
      "text_summary": {}
    }
  }
}
  • 查询不含国家二字的统计
GET smetrend_date/info/_search
{  
    "size" : 0,
    "aggs" : {   
        "messages" : {  
            "terms" : {   
              "size" : 200,
              "field" : "text_summary",
              "include" : "[\u4E00-\u9FA5][\u4E00-\u9FA5]",
              "exclude" : "国家.*"
            }  
        }  
    },
   "highlight": {
     "fields": {
      "text_summary": {}
    }
  }     
}
  • 时间范围与二字关键词混合搜索
GET smetrend_date/info/_search
{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2018-12-08",
        "lte": "2018-12-12",
        "format": "yyyy-MM-dd"
      }
    }
  },
  "aggs": {
    "messages": {
      "terms": {
        "size": 200,
        "field": "text_summary",
        "include": "[\u4E00-\u9FA5][\u4E00-\u9FA5]",
        "exclude": "国家.*"
      }
    }
  }
}

python脚本操作ES数据

import re
from elasticsearch import Elasticsearch
from bs4 import BeautifulSoup
import time

es = Elasticsearch([
    {'host': '192.168.1.126'},
    {'host': 'othernode', 'port': 9200, 'url_prefix': 'es', 'use_ssl': True},
])

body="""{
  "query": {
    "range": {
      "publish_date": {
        "gte": "2017-01-01",
        "lte": "2017-06-30",
        "format": "yyyy-MM-dd"
      }
    }
  },
  "aggs": {
    "messages": {
      "terms": {
        "size": 800,
        "field": "text_summary",
        "include": ["服务", "*****输入查询的关键词"]
       , "order": {
         "_term": "desc"
       }
      }
    }
  }
}"""

result=es.search(index='smetrend_date', doc_type='info',body=body)
aggs=result['aggregations']
messages=aggs['messages']
buckets=messages['buckets']
# 数据获取存入excel
list_all=[]
list_all2=[]
for bucket in buckets:
    list_i=[]
    key_word=bucket['key']
    count=bucket['doc_count']
    list_i.append(key_word)
    list_i.append(count)
    list_all.append(list_i)
    list_all2.append(key_word)
    list_all2.append(count)
    
print(len(list_all))
print(len(list_all2))
    
dic = dict(zip(list_all2[::2], list_all2[1::2]))
list_key=["服务", "*****输入查询的关键词"]

list_keyword=[]
for key_i in list_key:
    list_i=[]
    list_i.append(key_i)
    list_i.append(dic[key_i])
    list_keyword.append(list_i)


for i in list_keyword:
    print(i)
    

from pandas import DataFrame

data_result=DataFrame(list_keyword)
data_result.to_excel("2017_shang.xlsx")

### Elasticsearch 详细介绍 Elasticsearch 是一种分布式、RESTful 风格的搜索引擎和分析引擎,能够快速存储、搜索和分析大量数据。它基于 Apache Lucene 构建,并扩展了 Lucene 的全文搜索能力,提供了易于使用的 HTTP 接口以及多语言客户端支持。 #### 主要特性 - **实时查询**:提供近似实时的数据检索功能。 - **高可用性和可伸缩性**:通过集群化部署实现自动故障转移和支持水平扩展的能力。 - **灵活的模式映射**:允许动态定义索引结构并能处理复杂嵌套对象。 - **强大的聚合框架**:不仅限于简单关键字匹配,还具备统计计算等功能[^1]。 ### 使用指南 为了有效地利用 Elasticsearch 进行应用开发,遵循一些基本指导原则是非常重要的: #### 设计合理的文档模型 设计良好的文档模型对于优化查询效率至关重要。应考虑如何组织字段及其类型来满足业务需求的同时保持灵活性。例如,在创建新索引之前先规划好所需的映射关系可以减少后期调整带来的麻烦。 #### 合理配置硬件资源 根据实际负载情况适当分配内存给 JVM 堆空间和其他系统组件;确保有足够的磁盘 I/O 性能满足写入操作的需求;选择 SSD 可显著提高读取速度。 #### 实施有效的分片策略 合理设置主副分片数量有助于平衡节点间的工作量分布,从而提升整体性能表现。一般情况下,默认的一主一副即可满足大多数场景下的可靠性要求,但对于大型生产环境则需更细致地评估具体参数设定。 ```json PUT my-index-000001 { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } } ``` ### 官方文档 官方文档是最权威的学习资料之一,涵盖了从安装到高级特性的方方面面。以下是几个重要部分链接: - [Elasticsearch Guide](https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html)[^2] 这里包含了详细的命令说明和技术细节描述,非常适合深入学习各个方面的知识点。 ### 最佳实践 跟踪最新的最佳实践经验可以帮助开发者避免常见错误并充分利用平台优势。这些建议往往来自于一线工程师们的真实项目经历总结而成,因此具有很高的参考价值[^3]。 例如,在日常运维过程中定期监控集群健康状态、及时清理不再需要的历史日志文件等措施都能够有效保障系统的稳定运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值