当前位置:  首页>> 技术小册>> ElasticSearch零基础到实战

本文将介绍ElasticSearch分布式文档搜索机制,包括索引、文档、查询和搜索等方面,并结合代码示例,尽可能地让读者更好地了解ElasticSearch的搜索机制。

索引
在ElasticSearch中,索引是一种数据结构,用于管理和组织文档。一个索引可以包含多个文档,每个文档都有自己的唯一ID。ElasticSearch将索引分为多个分片和副本,这些分片和副本分布在集群中的多个节点上,从而实现了数据的分布式存储和搜索。

在ElasticSearch中,我们可以使用PUT命令创建一个新的索引,如下所示:

  1. PUT /索引名称

其中,索引名称可以是任意字符串,但建议使用具有描述性的名称。

文档
在ElasticSearch中,文档是数据的基本单位。一个文档可以是一个JSON对象,包含多个字段。ElasticSearch使用文档的字段来进行搜索和过滤操作。

每个文档都有一个唯一的ID,可以使用PUT命令将一个新的文档插入到指定的索引中,如下所示:

  1. PUT /索引名称/_doc/文档ID
  2. {
  3. "字段1": "值1",
  4. "字段2": "值2",
  5. ...
  6. }

其中,文档ID可以是任意字符串,但建议使用具有描述性的名称。另外,字段名和字段值可以根据实际情况进行修改。

查询
在ElasticSearch中,我们可以使用查询来搜索文档。查询可以根据关键字、过滤条件、排序方式等多个因素来进行匹配。ElasticSearch支持多种类型的查询,包括term查询、match查询、range查询、bool查询等等。

下面是一些常见的查询示例:

(1)term查询:用于精确匹配一个字段的值

  1. GET /索引名称/_search
  2. {
  3. "query": {
  4. "term": {
  5. "字段名": "字段值"
  6. }
  7. }
  8. }

(2)match查询:用于匹配一个字段中包含指定关键字的文档

  1. GET /索引名称/_search
  2. {
  3. "query": {
  4. "match": {
  5. "字段名": "关键字"
  6. }
  7. }
  8. }

(3)range查询:用于匹配一个字段的值在指定范围内的文档

  1. GET /索引名称/_search
  2. {
  3. "query": {
  4. "range": {
  5. "字段名": {
  6. "gte": 最小值,
  7. "lte": 最大值
  8. }
  9. }
  10. }
  11. }

(4)bool查询:用于组合多个查询条件,支持must、should、must_not和filter等操作符。

  1. GET /索引名称/_search
  2. {
  3. "query": {
  4. "bool": {
  5. "must": [
  6. {
  7. "term": {
  8. "字段1": "值1"
  9. }
  10. },
  11. {
  12. "term": {
  13. "字段2": "值2"
  14. }
  15. }
  16. ],
  17. "filter": {
  18. "range": {
  19. "字段3": {
  20. "gte": 最小值,
  21. "lte": 最大值
  22. }
  23. }
  24. },
  25. "should": [
  26. {
  27. "match": {
  28. "字段4": "关键字1"
  29. }
  30. },
  31. {
  32. "match": {
  33. "字段5": "关键字2"
  34. }
  35. }
  36. ],
  37. "must_not": {
  38. "term": {
  39. "字段6": "值3"
  40. }
  41. }
  42. }
  43. }
  44. }

搜索
在ElasticSearch中,我们可以使用搜索API来执行查询操作。搜索API可以接受多个参数,包括查询条件、分页参数、排序方式等等。

下面是一个基本的搜索示例:

  1. GET /索引名称/_search
  2. {
  3. "query": {
  4. "match": {
  5. "字段名": "关键字"
  6. }
  7. }
  8. }

其中,我们可以将字段名和关键字替换为实际的字段名和关键字。另外,我们还可以添加一些其他的参数来控制搜索的结果,如下所示:

  1. GET /索引名称/_search
  2. {
  3. "query": {
  4. "match": {
  5. "字段名": "关键字"
  6. }
  7. },
  8. "from": 0, // 分页参数,表示从第0条记录开始
  9. "size": 10, // 分页参数,表示返回10条记录
  10. "sort": [ // 排序方式,按照score字段降序排列
  11. {
  12. "score": {
  13. "order": "desc"
  14. }
  15. }
  16. ],
  17. "_source": ["字段1", "字段2"] // 返回指定的字段
  18. }

示例代码
下面是一个完整的ElasticSearch搜索示例代码,可以用来搜索指定索引中的文档,并输出匹配的结果:

  1. from elasticsearch import Elasticsearch
  2. # 创建ElasticSearch客户端
  3. es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
  4. # 搜索索引中包含关键字的文档
  5. query = {
  6. "query": {
  7. "match": {
  8. "字段名": "关键字"
  9. }
  10. }
  11. }
  12. # 返回前10条匹配的结果
  13. res = es.search(index="索引名称", body=query, size=10)
  14. # 输出匹配的结果
  15. for hit in res['hits']['hits']:
  16. print(hit['_source'])

小结:
本文介绍了ElasticSearch分布式文档搜索机制,包括索引、文档、查询和搜索等方面。ElasticSearch具有分布式存储和搜索的特点,可以帮助我们快速地搜索和分析海量数据。在实际


该分类下的相关小册推荐: