1、倒排索引(Lucene索引)
Lucene索引是一个用于全文搜索的倒排索引(Inverted Index)库,它是Apache Lucene项目的核心组件。倒排索引是一种数据结构,它可以根据每个词汇在文档中的出现情况来构建索引。
Lucene索引由多个文档(Document)组成,每个文档都包含一个或多个字段(Field),每个字段都可以包含一个或多个词汇(Term)。当一个文档被加入到索引中时,Lucene会对该文档中的每个字段进行分词(Tokenization),并且生成一个包含词汇和其在文档中出现位置的倒排列表(Inverted List)。
通过这种方式,Lucene索引可以快速地查询出包含某个词汇的文档,并且可以按照相关性排序返回结果。此外,Lucene还支持各种查询类型,包括布尔查询、短语查询、模糊查询、范围查询等。
Lucene索引不仅可以用于文本搜索,还可以用于数值、日期等类型的数据搜索。它被广泛应用于搜索引擎、电子邮件、文档管理系统等领域,成为了搜索技术的基石之一。
在搜索引擎中,每个文档都要有一个文档id,文档内容相当就是一系列的关键词集合,文档就会经过分词,提取多个关键词,每个关键词就会都会记录他在文档中出现的次数以及文档出现的位置.
2、ElecticSearch的索引(索引)
在Elasticsearch中,索引(Index)是指一个具有特定名称的逻辑数据容器,它包含了一组具有共同属性的文档(Document)。索引是在Elasticsearch中组织和管理数据的主要方式之一,它类似于传统数据库中的表。
在Elasticsearch中,索引可以看作是一个逻辑上的分区,用于存储文档和相关的元数据。每个索引都有一个唯一的名称,可以包含多个分片(Shard)和副本(Replica),并且可以被配置为具有不同的分片数量和复制数量。
索引中的文档是具有相似结构的JSON对象,它们可以包含文本、数字、日期、地理位置和其他类型的数据。文档可以通过HTTP请求或者客户端API添加、更新或删除,也可以通过查询来检索和搜索。
每个文档都有一个唯一的ID,可以使用ID来检索或更新单个文档。此外,文档还可以包含自定义字段、元数据和其他相关信息,例如时间戳、标记和关联数据等。
索引还可以通过设置和映射(Mapping)来定义文档的结构和属性。映射是索引中存储的文档的元数据,它描述了文档中包含的字段和其对应的数据类型、分析器、索引选项和其他属性等。映射可以使用REST API或者客户端API进行管理和更新。
总之,索引是Elasticsearch中重要的组织和管理数据的方式,它为用户提供了灵活、可扩展和高效的搜索和分析功能。
3、 ElecticSearch的分片、ElecticSearch的索引、Lucene 索引
分片(Shard)
在 Elasticsearch 中,数据被分割成多个分片,每个分片都是一个独立的 Lucene 索引。每个分片都可以存储一部分文档数据,并独立地进行搜索和维护。分片可以被复制到其他节点上,以实现高可用性和负载均衡。Elasticsearch 默认情况下每个索引都有 5 个分片。
索引(Index)
索引是一种逻辑上的概念,用于表示一组具有共同特征的文档集合。在 Elasticsearch 中,索引可以包含多个分片,每个分片都存储部分文档数据。索引是 Elasticsearch 中最高层次的数据单元,它可以被搜索、修改和删除。
Lucene 索引
Lucene 索引是 Elasticsearch 中的基础,它是一个基于 Java 的全文搜索引擎库,提供了创建和维护倒排索引的功能。倒排索引是一种用于实现全文搜索的数据结构,它记录了每个单词在文档集合中出现的位置和频率。在 Elasticsearch 中,每个分片都包含一个 Lucene 索引,它们被用来进行搜索、聚合和排序操作。
假如我有5个分片,有10个文档那其中的ElecticSearch的分片、ElecticSearch的索引、Lucene 索引、每个分片中的文档数量是多少 是一定的吗
假如你有 5 个分片,有 10 个文档,那么其中的 Elasticsearch 的分片、Elasticsearch 的索引、Lucene 索引以及每个分片中的文档数量都不是一定的,而是由多个因素决定的。
分片数量
在创建索引时可以指定分片的数量,如果没有指定,默认是 5 个分片。因此,如果你指定了 5 个分片,那么每个分片中会有 2 个文档。如果你指定了 10 个分片,那么每个分片中会有 1 个文档。
文档 ID
Elasticsearch 在将文档分配到分片时,是根据文档的 ID 值进行哈希运算的,得到一个分片编号。因此,如果你的文档 ID 值分散较均匀,那么每个分片中的文档数量就会比较平均。如果文档 ID 值存在分布不均的情况,那么每个分片中的文档数量就会不均衡。
分片再平衡
Elasticsearch 会根据节点的加入或者离开,或者索引的修改等情况,对分片进行再平衡。在再平衡的过程中,文档可能会被重新分配到不同的分片中,导致每个分片中的文档数量发生变化。
文档大小
每个文档的大小也会影响每个分片中的文档数量。如果文档非常大,一个分片可能只能存储少量的文档;而如果文档非常小,一个分片可以存储更多的文档。
因此,可以看出,Elasticsearch 的分片、索引、Lucene 索引和每个分片中的文档数量都不是一定的,而是由多个因素决定的。当你创建索引时,应该根据实际情况进行设置,以便最大程度地发挥 Elasticsearch 的性能和可扩展性。
4、ES的 新的索引什么时候被创建
在ES中,当需要创建一个新的索引时,通常是在以下情况下:
应用程序需要存储新的数据集:例如,在应用程序中收集新的日志数据、社交媒体数据或其他类型的数据时,需要创建一个新的索引来存储这些数据。
现有索引已经达到了其容量极限:如果现有索引已经存储了大量的数据,而且查询性能已经开始下降,那么就需要创建一个新的索引来分散负载并提高查询性能。
对现有索引进行重构:如果现有索引的结构、设置或数据需要更改,那么就需要创建一个新的索引来反映这些更改。例如,可以通过创建新的索引来添加、删除或更改字段,或者更改分片的数量和分配策略等。
在ES中,可以使用RESTful API或者Java客户端来创建新的索引。创建新索引时,需要指定索引的名称、分片的数量和复制的数量等参数。可以通过修改索引设置和映射来自定义索引的配置和特性,以满足特定的需求。
值得注意的是,在ES中,索引被设计为可变的,因此可以随时向现有索引中添加、更新或删除文档,或者修改索引的配置和映射。这使得ES成为一个灵活、可扩展和易于维护的搜索引擎平台。
5、 ES怎么区分文档是否相同呢
在 Elasticsearch 中,每个文档都有一个唯一的文档 ID,该 ID 用于标识文档并将其存储在特定的分片中。如果文档具有相同的文档 ID,则它们被视为同一文档,无论它们的内容是否相同。
如果你希望确保文档的内容不重复,可以使用文档内容的摘要或散列值来进行比较。在 Elasticsearch 中,可以使用 Hash 函数生成文档内容的散列值,并将其存储在索引中。在搜索时,你可以使用相同的 Hash 函数计算查询的散列值,并与存储在索引中的散列值进行比较,从而确定文档内容是否匹配。
注意,由于哈希函数具有冲突的可能性,因此不能保证两个不同的文档具有不同的哈希值,尤其是在文档内容较小时,哈希冲突的可能性更高。因此,散列值仅用于比较文档的内容是否相同,而不能用于判断文档是否唯一。
6、ElacticSearch 中match 和term 的区别
在 Elasticsearch 中,"match" 和 "term" 是两种不同的查询方式,它们的区别在于匹配的方式和精度不同。
"match" 查询是一种全文检索查询,可以用于在指定字段中查找与查询条件匹配的文档。"match" 查询会将查询字符串分词后进行匹配,而不是按照整个查询字符串进行精确匹配。例如,如果你想要查找 "title" 字段中包含 "Elasticsearch is a search engine" 这句话的所有文档,可以使用的 "match" 查询:
```
{
"query": {
"match": {
"title": "Elasticsearch is a search engine"
}
}
}
```
在这个例子中,"match" 查询会将查询字符串 "Elasticsearch is a search engine" 分词成五个词项 "Elasticsearch"、"is"、"a" 和 "search"、"engine",然后在 "title" 字段中查找同时包含这五个词项的文档。
"term" 查询是一种精确匹配查询,它会完全匹配查询条件的单个词项。例如,如果你想要查找 "title" 字段中值为 "Elasticsearch" 的所有文档,可以使用的 "term" 查询
```
{
"query": {
"term": {
"title": "Elasticsearch"
}
}
}
```
在这个例子中,"term" 查询会精确匹配 "title" 字段中值为 "Elasticsearch" 的文档,而不会对查询字符串进行分词。
总的来说,"match" 查询和 "term" 查询都是 Elasticsearch 中常用的查询方式,它们可以用于不同的场景,具有不同的匹配方式和精度。"match" 查询主要用于全文检索场景,可以匹配包含查询条件的文档,而 "term" 查询则主要用于精确匹配某个字段的值,对查询条件不进行分词。