第17篇使用Python的初学者Elasticsearch教程

38次阅读

共计 5735 个字符,预计需要花费 15 分钟才能阅读完成。

我的 Elasticsearch 系列文章,逐渐更新中,欢迎关注
0A. 关于 Elasticsearch 及实例应用
00.Solr 与 ElasticSearch 对比
01.ElasticSearch 能做什么?
02.Elastic Stack 功能介绍
03. 如何安装与设置 Elasticsearch API
04. 如果通过 elasticsearch 的 head 插件建立索引_CRUD 操作
05.Elasticsearch 多个实例和 head plugin 使用介绍
06. 当 Elasticsearch 进行文档索引时,它是如何工作的?
07.Elasticsearch 中的映射方式—简洁版教程
08.Elasticsearch 中的分析和分析器应用方式
09.Elasticsearch 中构建自定义分析器
10.Kibana 科普 - 作为 Elasticsearhc 开发工具
11.Elasticsearch 查询方法
12.Elasticsearch 全文查询
13.Elasticsearch 查询 - 术语级查询
14.Python 中的 Elasticsearch 入门
15. 使用 Django 进行 ElasticSearch 的简单方法
16. 关于 Elasticsearch 的 6 件不太明显的事情
17. 使用 Python 的初学者 Elasticsearch 教程

另外 Elasticsearch 入门,我强烈推荐 ElasticSearch 搭建手册给你,非常想尽的入门指南手册。

Elasticsearch 是一个实时的分布式搜索和分析引擎。它使您能够以前所未有的速度和规模探索数据。它用于全文搜索,结构化搜索,分析以及所有这三种方法的组合。弹性搜索是基于 Apache Lucecne(一个全文本搜索引擎库)构建的开源搜索引擎。
安装并运行 Elasticsearch:
安装 Elasticsearch 的唯一要求是 Java 的最新版本。要安装 Elasticsearch,请从 elastic.co/downlaods/elasticsearch 下载并提取存档文件,然后只需运行 bin elasticsearch.bat。

索引就像传统数据库中的数据库。它是存储相关文档的地方。要检索任何文档,我们需要三条信息

  1. 索引—数据库
  2. 数据类型 - 文档类型
  3. ID- 文件 ID

让我们开始表演吧……

Import Elasticsearch package

from elasticsearch import Elasticsearch

Connect to the elastic cluster

es=Elasticsearch([{‘host’:’localhost’,’port’:9200}])
es<Elasticsearch([{‘host’: ‘localhost’, ‘port’: 9200}])>

Elasticsearch 是面向文档的,这意味着它可以存储整个对象或文档。它不仅存储它们,而且索引每个文档的内容以使其可搜索。在 Elasticsearch 中,您可以对文档进行索引,搜索,排序和过滤。
Elasticsearch 使用 JSON 作为文档的序列化格式。
现在让我们开始索引员工文档。
在 Elasticsearch 中存储数据的行为称为索引编制。
Elasticsearch 集群可以包含多个索引,而索引又包含多个类型。这些类型包含多个文档,并且每个文档都有多个字段。

e1={
    "first_name":"nitin",
    "last_name":"panwar",
    "age": 27,
    "about": "Love to play cricket",
    "interests": ['sports','music'],
}print e1{'interests': ['sports', 'music'], 'about': 'Love to play cricket', 'first_name': 'nitin', 'last_name': 'panwar', 'age': 27}

插入文件:
#现在让我们将此文档存储在 Elasticsearch
res = es.index(index =’megacorp’,doc_type =’employee’,id = 1,body = e1)中简单!无需先执行任何管理任务,例如创建索引或指定每个字段包含的数据类型。我们可以直接为文档建立索引。Elasticsearch 附带所有内容的默认值,因此使用默认值在后台处理了所有必要的管理任务。
检索文档:
在 Elasticsearch 中这很容易。我们只需执行一个 HTTP GET 请求并指定文档的地址 - 索引,类型和 ID。使用这三段信息,我们可以返回原始 JSON 文档。

# Let's insert some more documents
e2={
    "first_name" :  "Jane",
    "last_name" :   "Smith",
    "age" :         32,
    "about" :       "I like to collect rock albums",
    "interests":  ["music"]
}
e3={
    "first_name" :  "Douglas",
    "last_name" :   "Fir",
    "age" :         35,
    "about":        "I like to build cabinets",
    "interests":  ["forestry"]
}res=es.index(index='megacorp',doc_type='employee',id=2,body=e2)
print res['created']
res=es.index(index='megacorp',doc_type='employee',id=3,body=e3)
print res['created']False
True

删除文件:

res=es.get(index='megacorp',doc_type='employee',id=3)
print res{u'_type': u'employee', u'_source': {u'interests': [u'forestry'], u'age': 35, u'about': u'I like to build cabinets', u'last_name': u'Fir', u'first_name': u'Douglas'}, u'_index': u'megacorp', u'_version': 1, u'found': True, u'_id': u'3'}

搜索精简版:
GET 非常简单 - 取回所需的文档。让我们尝试一些更高级的操作,例如简单的搜索!

res= es.search(index='megacorp',body={'query':{}})
print res['hits']['hits'][{u'_score': 1.0, u'_type': u'employee', u'_id': u'4', u'_source': {u'interests': [u'sports', u'music'], u'age': 27, u'about': u'Love to play football', u'last_name': u'pafdfd', u'first_name': u'asd'}, u'_index': u'megacorp'}, {u'_score': 1.0, u'_type': u'employee', u'_id': u'2', u'_source': {u'interests': [u'music'], u'age': 32, u'about': u'I like to collect rock albums', u'last_name': u'Smith', u'first_name': u'Jane'}, u'_index': u'megacorp'}, {u'_score': 1.0, u'_type': u'employee', u'_id': u'1', u'_source': {u'interests': [u'sports', u'music'], u'age': 27, u'about': u'Love to play cricket', u'last_name': u'panwar', u'first_name': u'nitin'}, u'_index': u'megacorp'}]

现在,让我们搜索姓氏为 nitin 的用户名。
匹配运算符:

res= es.search(index='megacorp',body={'query':{'match':{'first_name':'nitin'}}})
print res['hits']['hits'][{u'_score': 0.2876821, u'_type': u'employee', u'_id': u'1', u'_source': {u'interests': [u'sports', u'music'], u'age': 27, u'about': u'Love to play cricket', u'last_name': u'panwar', u'first_name': u'nitin'}, u'_index': u'megacorp'}]
布尔运算符:bool 使用字典,其中至少包含 must,should 和 must_not 中的一个,每个字典都包含匹配列表或其他进一步的搜索运算符。res= es.search(index='megacorp',body={
        'query':{
            'bool':{
                'must':[{
                        'match':{'first_name':'nitin'}
                    }]
            }
        }
    })print res['hits']['hits'][{u'_score': 0.2876821, u'_type': u'employee', u'_id': u'1', u'_source': {u'interests': [u'sports', u'music'], u'age': 27, u'about': u'Love to play cricket', u'last_name': u'panwar', u'first_name': u'nitin'}, u'_index': u'megacorp'}]

过滤运算符:
让我们使搜索更加复杂。我们仍然希望找到所有姓氏为 nitin 的员工,但我们只希望年龄在 30 岁以上的员工。我们的查询将略有变化以适应过滤器,这使我们可以高效地执行结构化搜索:

res= es.search(index='megacorp',body={
        'query':{
            'bool':{
                'must':{
                    'match':{'first_name':'nitin'}
                },
                "filter":{
                    "range":{
                        "age":{"gt":25}
                    }
                }
            }
        }
    })print res['hits']['hits'][{u'_score': 0.2876821, u'_type': u'employee', u'_id': u'1', u'_source': {u'interests': [u'sports', u'music'], u'age': 27, u'about': u'Love to play cricket', u'last_name': u'panwar', u'first_name': u'nitin'}, u'_index': u'megacorp'}]res= es.search(index='megacorp',body={
        'query':{
            'bool':{
                'must':{
                    'match':{'first_name':'nitin'}
                },
                "filter":{
                    "range":{
                        "age":{"gt":27}
                    }
                }
            }
        }
    })print res['hits']['hits'][]

全文搜索
到目前为止,搜索非常简单。让我们尝试更高级的全文搜索。在开始下一种搜索之前,让我再插入一个文档。

res= es.search(index='megacorp',body={
        'query':{
            'bool':{
                'must':{
                    'match':{'first_name':'nitin'}
                },
                "filter":{
                    "range":{
                        "age":{"gt":25}
                    }
                }
            }
        }
    })print res['hits']['hits'][{u'_score': 0.2876821, u'_type': u'employee', u'_id': u'1', u'_source': {u'interests': [u'sports', u'music'], u'age': 27, u'about': u'Love to play cricket', u'last_name': u'panwar', u'first_name': u'nitin'}, u'_index': u'megacorp'}]res= es.search(index='megacorp',body={
        'query':{
            'bool':{
                'must':{
                    'match':{'first_name':'nitin'}
                },
                "filter":{
                    "range":{
                        "age":{"gt":27}
                    }
                }
            }
        }
    })print res['hits']['hits'][]

在上面的示例中,它返回两个记录,但得分不同。
词组搜索
在一个字段中查找单个单词很好,但是有时候您想要匹配短语中单词的确切顺序。

res= es.search(index='megacorp',doc_type='employee',body={
        'query':{
            'match_phrase':{"about":"play cricket"}
        }
    })
for hit in res['hits']['hits']:
    print hit['_source']['about'] 
    print hit['_score']
    print '**********************'Love to play cricket
0.5753642
**********************

集合体
Elasticsearch 具有称为聚合的功能,该功能使您可以对数据进行复杂的分析。它与 SQL 中的“分组依据”相似,但功能更强大。

res= es.search(index='megacorp',doc_type='employee',body={
        "aggs": {
            "all_interests": {"terms": { "field": "interests"}
            }
        }
    })

正文完
 0