本文将介绍ElasticSearch分布式文档搜索机制,包括索引、文档、查询和搜索等方面,并结合代码示例,尽可能地让读者更好地了解ElasticSearch的搜索机制。
索引
在ElasticSearch中,索引是一种数据结构,用于管理和组织文档。一个索引可以包含多个文档,每个文档都有自己的唯一ID。ElasticSearch将索引分为多个分片和副本,这些分片和副本分布在集群中的多个节点上,从而实现了数据的分布式存储和搜索。
在ElasticSearch中,我们可以使用PUT命令创建一个新的索引,如下所示:
PUT /索引名称
其中,索引名称可以是任意字符串,但建议使用具有描述性的名称。
文档
在ElasticSearch中,文档是数据的基本单位。一个文档可以是一个JSON对象,包含多个字段。ElasticSearch使用文档的字段来进行搜索和过滤操作。
每个文档都有一个唯一的ID,可以使用PUT命令将一个新的文档插入到指定的索引中,如下所示:
PUT /索引名称/_doc/文档ID
{
"字段1": "值1",
"字段2": "值2",
...
}
其中,文档ID可以是任意字符串,但建议使用具有描述性的名称。另外,字段名和字段值可以根据实际情况进行修改。
查询
在ElasticSearch中,我们可以使用查询来搜索文档。查询可以根据关键字、过滤条件、排序方式等多个因素来进行匹配。ElasticSearch支持多种类型的查询,包括term查询、match查询、range查询、bool查询等等。
下面是一些常见的查询示例:
(1)term查询:用于精确匹配一个字段的值
GET /索引名称/_search
{
"query": {
"term": {
"字段名": "字段值"
}
}
}
(2)match查询:用于匹配一个字段中包含指定关键字的文档
GET /索引名称/_search
{
"query": {
"match": {
"字段名": "关键字"
}
}
}
(3)range查询:用于匹配一个字段的值在指定范围内的文档
GET /索引名称/_search
{
"query": {
"range": {
"字段名": {
"gte": 最小值,
"lte": 最大值
}
}
}
}
(4)bool查询:用于组合多个查询条件,支持must、should、must_not和filter等操作符。
GET /索引名称/_search
{
"query": {
"bool": {
"must": [
{
"term": {
"字段1": "值1"
}
},
{
"term": {
"字段2": "值2"
}
}
],
"filter": {
"range": {
"字段3": {
"gte": 最小值,
"lte": 最大值
}
}
},
"should": [
{
"match": {
"字段4": "关键字1"
}
},
{
"match": {
"字段5": "关键字2"
}
}
],
"must_not": {
"term": {
"字段6": "值3"
}
}
}
}
}
搜索
在ElasticSearch中,我们可以使用搜索API来执行查询操作。搜索API可以接受多个参数,包括查询条件、分页参数、排序方式等等。
下面是一个基本的搜索示例:
GET /索引名称/_search
{
"query": {
"match": {
"字段名": "关键字"
}
}
}
其中,我们可以将字段名和关键字替换为实际的字段名和关键字。另外,我们还可以添加一些其他的参数来控制搜索的结果,如下所示:
GET /索引名称/_search
{
"query": {
"match": {
"字段名": "关键字"
}
},
"from": 0, // 分页参数,表示从第0条记录开始
"size": 10, // 分页参数,表示返回10条记录
"sort": [ // 排序方式,按照score字段降序排列
{
"score": {
"order": "desc"
}
}
],
"_source": ["字段1", "字段2"] // 返回指定的字段
}
示例代码
下面是一个完整的ElasticSearch搜索示例代码,可以用来搜索指定索引中的文档,并输出匹配的结果:
from elasticsearch import Elasticsearch
# 创建ElasticSearch客户端
es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
# 搜索索引中包含关键字的文档
query = {
"query": {
"match": {
"字段名": "关键字"
}
}
}
# 返回前10条匹配的结果
res = es.search(index="索引名称", body=query, size=10)
# 输出匹配的结果
for hit in res['hits']['hits']:
print(hit['_source'])
小结:
本文介绍了ElasticSearch分布式文档搜索机制,包括索引、文档、查询和搜索等方面。ElasticSearch具有分布式存储和搜索的特点,可以帮助我们快速地搜索和分析海量数据。在实际