wjx-2005-07-01  

Elasticsearch

​ Elasticsearch 是一个基于 Apache Lucene 构建的开源搜索引擎。它提供了一个分布式、多用户能里的全文搜索引擎,基于 RESTful Web 接口。

Kibana

​ Kibana 是一个开源的数据可视化平台,通常与 Elasticsearch 配合使用,用于搜索、分析和可视化数据。虽然 Kinaba 提供了一个图形界面来与 Elasticsearch 交互,但它本身不直接构建索引。索引的创创建通常是通过 Elasticsearch 的API 或这使用 Logstash 这样的数据管道工具来完成的。

​ 但不过,可以在 Kibana 的 Dev Tools 控制台中使用 Elasticsearch 的 API 来创建索引。

Apache Lucene

Apache Lucene 是一个高性能、可扩展的信息检索库,它提供了全文搜索功能,并且是 Elasticsearch 和 Solr 等搜索引擎的基础。
Lucene 的主要特点包括:
  • 高性能:专为速度而设计,能够快速地执行搜索操作。
  • 可扩展性:可运行在各种平台上。
  • 全文搜索:支持全文搜索。
  • 索引和搜索:允许用户创建一个索引,然后可以对这个索引执行索引查询。
  • 灵活性:提供了丰富的 API ,允许开发者自定义搜索逻辑和索引结构,
  • 多语言支持:支持多语言的文本分析
  • 开源:拥有活跃的社区支持。
Lucene 的工作流程通常包括以下几个步骤:

1、文档添加:将文档添加到索引中,文档被分解成单独的字段,每个字段包含一系列的词项。

2、索引构建:Lucene 为每个词项创建一个索引,包括词项在文档中的位置信息。

3、查询处理:用户发起查询时,Lucene 根据查询条件在索引中查找匹配的文档。

4、结果返回:Lucene 返回匹配俄文档列表,通常是按照相关性排序的。

Elasticsearch 具有以下特点:
  1. 分布式和可扩展:Elasticsearch 可以在多台机器上运行,以分布式的方式存储数据,提供高可用性和扩展性。
  2. 实时性:Elasticsearch 能够实时索引和搜索数据,几乎没有延迟。
  3. 多种语言和格式支持:Elasticsearch 支持多种数据格式和语言,能够处理结构化和非结构化数据。
  4. 强大的API:Elasticsearch 提供了丰富的 RESTful API,方便用户进行数据操作和搜索。
  5. 易于使用:Elasticsearch 有着良好的文档和社区支持,使得用户能够相对容易地开始使用和维护。 Elasticsearch 通常与其他软件结合使用,如 Logstash 进行数据收集和处理,Kibana 进行数据可视化,共同构成 ELK Stack(Elasticsearch, Logstash, Kibana),广泛应用于日志分析、安全情报、业务分析等领域。

Elasticsearch 将数据存储在索引中,每个索引由多个分片组成,分片是数据存储和检索的基本单元。

Elasticsearch 数据存储

Elasticsearch 中的数据存储主要涉及一下几个概念:

1、索引(Index):相当于关系数据库中的一个数据库,是逻辑上的概念,由一个或多个分片组成。

2、分片(Shard):物理上的数据单元,每个分片是一个 Lucene 索引,可以分布在集群中的不同节点上。

3、文档(Document):存储在分片中的基本信息单位,相当于关系型数据库中的一行记录。

4、字段(Field):文档的组成部分,每个字段都有数据类型,如 text、date、integer等。

5、倒排索引(Inverted Index):Lucene 使用的数据结构,用于快速全文搜索,它的每个唯一的词映射到包含该词的文档列表。

索引创建与查询(kibana)

# 创建索引
PUT /my_new_index
{
	'settings':{
		'number_of_shards':1,
		'number_of_replicas':0,
	},
	'mappings':{
		'properties':{
			'title':{
				'type':'text'
			},
			'description':{
				'type':'text',
				'fields':{
					'raw':{
						'type':'keyword'
					}
				}
			},
			'date':{
				'type':"date",
				'format':'yyyy-MM-dd HH:mm:ss'
			}
		}
	}
}

以上命令创建了一个名为 my_new_index 的新索引,设置了一个 1 个分片和 0 个副本。同时定义了索引的映射(mappings),包括三个字段:title(标题),description(描述)和 date(日期)。title 和description 字段都被设置为文本类型,其中 description 字段还有一个 raw 子字段,用于精确匹配。date字段被设置为日期类型,并指定了日期格式。

# 查询语法
GET /my_new_index/_search
{
	'query':{
		'match':{
			'title':'Elasticsearch'
		}
	}
}

举一个简单的例子:假设我们有一个博客平台的 Elasticsearch 索引 ,其中包含文章的标题、内容、发布日期等字段。以下是一些查询实例:

# 搜索标题包含特定词汇的文章

GET /blog/_search
{
	'query':{
		'match':{
			'title':'Elasticsearch'
		}
	}
}
# 根据发布日期范围查询文章
GET /blog/_search
{
	'query':{
		'range':{
			'date':{
				'gte':"2021-01-01",
				'lte':'2021-12-31'
			}
		}
	}
}
# 符合查询,同时满足多个条件
GET /blog/_search
{
	'query':{
		'bool':{
			'nust':[
				{'match':{'title':'Elasticsearch'}},
				{'range':{'date':{'gte':'2021-01-01'}}}
			],
			"must_not": [
                { "match": { "tags": "deprecated" }}
             ],
              "should": [
                { "match": { "author": "John Doe" }}
             ],
		}
	}
}

这个查询结合了必须、必须不和应该条件,查找标题包含 "Elasticsearch", 发布日期在2021年,且不包含标签 "deprecated" 的文章,同时优先返回作者为 "John Doe" 的文章。

# 聚合查询
GET /blog/_search
{
	'size':0,
	'aggs':{
		'top_authors':{
			'terms':{
				'field':"author",
				'size':10
			}
		}
	}
}

这个查询不会返回文章,而是返回一个聚合结果,显示最活跃的前10位作者。

数据写入与删除

# 写入文档数据
POST /my_index/_doc/your_custom_id
{
	'field1':"value1",
	'field2':123
}
# 批量写入数据
POST /my_index/_bulk
{'index':{'_id':'1'}}
{'field1':'value1'}
{'index':{'_id':"2"}}
{'field2':{'value2'}}
{'index':{'_id':'3'}}
......
# 删除索引
DELETE /index_name
posted on 2024-03-30 23:25  星辰与Python  阅读(12)  评论(0编辑  收藏  举报