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")