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 具有以下特点:
- 分布式和可扩展:Elasticsearch 可以在多台机器上运行,以分布式的方式存储数据,提供高可用性和扩展性。
- 实时性:Elasticsearch 能够实时索引和搜索数据,几乎没有延迟。
- 多种语言和格式支持:Elasticsearch 支持多种数据格式和语言,能够处理结构化和非结构化数据。
- 强大的API:Elasticsearch 提供了丰富的 RESTful API,方便用户进行数据操作和搜索。
- 易于使用: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
标签:index,查询,Lucene,索引,文档,Elasticsearch
From: https://www.cnblogs.com/wjx-2005-07-01/p/18106241