当前位置:   article > 正文

python 读取Elasticsearch数据_python es

python es

目录

1、基本概念

2、基本操作

(1)列的选择

(2)条件过滤的条件构成(match、term和range)

精确匹配

模糊匹配  

范围匹配range   

 空值判断

(3)过滤条件的组合

(4)聚合统计分析

3、python连接ES并做查询

参考文献


1、基本概念

    全文搜索属于最常见的需求,开源的 Elasticsearch是目前全文搜索引擎的首选。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用它。(阮一峰老师博客

    ES相对SQL型数据库来说,没有很明确的表的概念,它与SQL型数据库的结构类比如下:

                                                    图来源:Elasticsearch对应MySQL的对应关系

     对于SQL型数据来说,基本的数据单位是一条record,由不同的属性列组成,而在ES中,基本的数据单位是一个document,它是由key-value形式的键值对组成的一个json类型的文本,这里的key-value则叫做field。相同类型的document就形成一个type,也就是我们常说的数据表,最后所有的数据表一起形成一个数据库,在ES里面就叫做index。如果在写入数据时没有设计type,那么所有的数据默认的type都是"_doc",这个有时候在查询数据时会用到,ES现在也有在弱化这个type的存在。对于SQL数据库来说,表的设计叫schema,对应的在ES中,一个index的设计叫做mapping。

    对于ES中可以存储的数据,目前的数据类型有:(此处有参考)

    基本数据结构:text, keyword, date, long, double, boolean,ip
    json数据结构:object, nested
   专用数据结构:geo_point, geo_shape, completion

2、基本操作

      关于index的建立和相应操作,可以参考阮一峰老师的博客,对于在kibnan之类的可以用命令行操作的,可以参考:es查询DSL语句

      对于只是使用数据库中的数据来说,有时候可能最关心的是,如何使用数据库的一些基本操作来帮助我们读写数据,以及做一些简单的数据分析。数据库的操作基本就是增删改查,在MySQL中是通过select……from……where之类的关键词构成SQL语句,然后执行语句完成功能,在ES中这样的语句则是由一个json格式的dict组成,如下是一个ES的搜索body涉及,与SQL语句的对应:

  1. GET /analysis/_search
  2. {
  3. "_source": { ---SELECT
  4. "includes": ["fileName","starttime","duration","repNo","repGroup","typeOfService"],
  5. "excludes": ["blankKeyword","keyword","topicHitDetail"]
  6. },
  7. "query": { ---WHERE
  8. "bool": {
  9. "filter": {
  10. "term": {
  11. "typeOfService": "转账"
  12. }
  13. }
  14. }
  15. },
  16. "aggs": { ---GROUP BY
  17. "class_buckets": { ---HAVING
  18. "filter": {
  19. "range": {
  20. "duration": {
  21. "gte": 600
  22. }
  23. }
  24. },
  25. "aggs": {
  26. "class_count": {
  27. "terms": {
  28. "field": "classfication_f"
  29. },
  30. "aggs": {
  31. "count": {
  32. "value_count": {
  33. "field": "classfication_f"
  34. }
  35. },
  36. "count_filter":{
  37. "bucket_selector": { ------HAVING
  38. "buckets_path": {
  39. "count":"count"
  40. },
  41. "script": "params.count>=1000"
  42. }
  43. }
  44. }
  45. }
  46. }
  47. }
  48. },
  49. "from": 0, ---LIMIT
  50. "size": 10,
  51. "sort": [ ---ORDER BY
  52. {
  53. "starttime": {
  54. "order": "desc"
  55. }
  56. }
  57. ]
  58. }

(1)列的选择

             通过"_source"这个key来选择需要搜索的数据属性字段,可以通过includes和excludes来指定需要搜索和不需要搜索的字段。

            "_source": [field1, field2,……,fieldn]          # 默认搜索包含该列表字段的数据

            类似于:select field1, field2,……,fieldn from index

  1. # 查询所有的记录,默认返回10条
  2. {
  3. "query": {
  4. "match_all": {}
  5. }
  6. }

(2)条件过滤的条件构成match、term和range

         一般在where的条件语句中,用得比较多的是精确查找"=",或者模糊匹配like,以及属性值的多项选择in()这类关键词。类似的,在ES中则是通过match来完成对应like的模糊匹配,通过term来完成对应"="和in的精确匹配。

  • 精确匹配

       首先来看精确匹配,在ES中,精确匹配是通过term来完成的。term过滤:term主要用于精确匹配,如字符串、数值、日期等(不适合情况:1.列中除英文字符外有其它值 2.字符串值中有冒号或中文 3.系统自带属性如_version)。例子如下

  1. # 精确匹配insertTime是2021年5月26日的document
  2. query = {
  3. "query": {
  4. "term": {"insertTime": "2021-05-26"}
  5. }
  6. }

       另一个就是类似于SQL中IN()用法的terms,用于某个字段满足多个值的情况,例子如下:

  1. # date为2014-09-01和2014-10-03的值都会被查找出来
  2. {
  3. "query": {
  4. "terms": {"date": ["2014-09-01","2014-10-03"]}
  5. }
  6. }
  • 模糊匹配  

        对于模糊匹配match也有几种情况,match是匹配给出的字符串中任意一个匹配到就可以了,match_phrase则是匹配给定的整个字符串(将这个字符串当做一个整体的短语),match_phrase_prefix是做前缀匹配,multi_match是做多个字段的搜索,具体例子如下:

  1. # 在full_name字段做匹配,匹配包含John或者Smith的document
  2. {
  3. "query" : {
  4. "match" : {
  5. "full_name" : "John Smith"
  6. }
  7. }
  8. }
  9. # 使用"operator", 匹配同时包含John和Smith的document
  10. {
  11. "query": {
  12. "match" : {
  13. "full_name" : {
  14. "query" : "John Smith",
  15. "operator" : "and"
  16. }
  17. }
  18. }
  19. }
  20. * ES默认的是对英文字符串用空格划分,对中文字符串直接做字的切分
  21. # 下面的例子则是匹配包含“银”或者“行”的文档
  22. {
  23. "query" : {
  24. "match" : {
  25. "full_name" : "银行"
  26. }
  27. }
  28. }
  1. # 匹配包含“银行”这个字符串的document
  2. {
  3. "query" : {
  4. "match_phrase" : {
  5. "full_name" : "银行"
  6. }
  7. }
  8. }
  1. # 在两个字段中做匹配
  2. {
  3. "query" : {
  4. "multi_match": {
  5. "query": "John Smith",
  6. "fields": ["first_name", "full_name"]
  7. }
  8. }
  9. }
  • 范围匹配range   

 对于字符串或者数值类的字段,match和term可以完成模糊或者精确的匹配,在SQL中还有一种常用的条件,数值型数据可以根据范围进行过滤,在ES中,则是通过range这个关键词来实现,例子如下:

  1. {
  2. "query": {
  3. "range":{
  4. "age":{ //查询age字段
  5. "gte":60, //大于60
  6. "lt":70 //小于70
  7. }
  8. }
  9. }
  10. }
  •  空值判断

        ES中的空值判断是通过“exist”和"missing"关键词实现的,例子如下:

  1. # 查询字段user不为空的字段
  2. {
  3. "query": {
  4. "exists" : { "field" : "user" }
  5. }
  6. }
  7. # age字段为空的所有数据
  8. {
  9. "query": {
  10. "missing":{ "field":"age"}
  11. }
  12. }

(3)过滤条件的组合

        一般where中的各个条件是用and或or来连接,在ES中则是将这些条件做了一个聚合,必须满足的条件放在"must"这个键的值,可以满足也可以不满足的条件则放在"should"这个键值对,一定不可以的条件放在"must_not"这个键值对,最后所有的条件作为"bool"这个键的值。示例如下:

  1. "query": {
  2. "bool": {
  3. "must": [
  4. {}
  5. ],
  6. "must_not": [
  7. {}
  8. ],
  9. "should": [
  10. {"bool": {
  11. "must": [
  12. {"term": {
  13. "callNumber": {
  14. "value": "95533"
  15. }
  16. }}
  17. ]
  18. }}
  19. ]
  20. }
  21. }

(4)聚合统计分析

         ES的聚合统计的关键词是"aggregations",一般简写成"aggs",它的作用就类似于SQL中的group by,也是在做数据分析和查询时经常会用到的,在ES的查询结构构成中和“query”关键词是一个级别的。
ES的聚合函数的结构一般由如下单元构成:
{
    "aggs":{
         rename:{                                  # 聚合后生成的新列的名称
             "aggs_function":{                 # 使用的聚合函数的名称
                  "terms": field_name        # 要做聚合的字段名称
             }
        }
    }
}

 例子如下:

  1. # 分组统计,即group by……count
  2. {
  3. "size": 0,
  4. "aggs": {
  5. "group_by_state": {
  6. "terms": {
  7. "field": "state"
  8. }
  9. }
  10. }
  11. }
  12. * 类似SQL
  13. SELECT state, COUNT(*) FROM customer GROUP BY state
  1. # avg求平均值
  2. GET /lockie_test/_search
  3. {
  4. "size": 0,
  5. "aggs": {
  6. "avg_dealDl": {
  7. "avg": {
  8. "field": "dealDl"
  9. }
  10. }
  11. }
  12. }
  1. # 分组聚合求平均值
  2. GET /lockie_test/_search
  3. {
  4. "size": 0,
  5. "aggs": {
  6. "group_by_time": {
  7. "terms": {
  8. "field": "balanceTime",
  9. "order": {
  10. "avg_dealDl": "asc"
  11. }
  12. },
  13. "aggs": {
  14. "avg_dealDl": {
  15. "avg": {
  16. "field": "dealDl"
  17. }
  18. }
  19. }
  20. }
  21. }
  22. }

可以使用的聚合函数如下(图片来源同上):

 参考:Elasticsearch 2.20入门篇:聚合操作ES简单实用DSL查询

(5)term和range一起使用

  1. {
  2. "query": {
  3. "bool": {
  4. "filter": [
  5. {
  6. "term": {
  7. "name": "kevin"
  8. }
  9. },
  10. {
  11. "range": {
  12. "age": {
  13. "gte": 20,
  14. "lte": 30
  15. }
  16. }
  17. }
  18. ]
  19. }
  20. }
  21. }

(6) text字段的term使用

  1. GET /index/_search
  2. {
  3. "query":{
  4. "term":{
  5. "field_name.keyword": "xxx"
  6. }
  7. }
  8. }
  1. GET bank/_search
  2. {
  3. "query":{
  4. "match":{
  5. "address.keyword": "467 Hutchinson"
  6. }
  7. }
  8. }

  参考:https://blog.csdn.net/dg19971024/article/details/107103201?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.controlicon-default.png?t=N7T8https://blog.csdn.net/dg19971024/article/details/107103201?utm_medium=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~CTRLIST~default-1.control


【ElasticSearch(九)进阶】Term精确数值查询,match keyword精确文本查询_u012161251的博客-CSDN博客【ElasticSearch(九)进阶】Term精确数值查询,match keyword精确文本查询一、Term精确数值查询term查询,会返回那些 在提供的字段中包含确切信息 的文档内容。查询text字段值,使用match。查询精确数值,使用term。为什么避免使用term对text字段进行查询?默认情况下,ES更改text字段的值作为词法分析的一部分。这会使查找text...https://blog.csdn.net/u012161251/article/details/119902442

3、python连接ES并做查询

      elasticsearch 库

pip install elasticsearch

  1. from elasticsearch import Elasticsearch
  2. ES_CONF = {
  3. "host": "192.168.11.22",
  4. "port": 9200,
  5. "user": "elastic",
  6. "passwd": "1234"
  7. }
  8. index = "test_index"
  9. def process_func():
  10. # 从ES读取数据
  11. es = Elasticsearch(
  12. [ES_CONF["host"]],
  13. http_auth=(ES_CONF["user"], ES_CONF["passwd"]),
  14. port=ES_CONF["port"]
  15. )
  16. # 条件查询
  17. query_json = {
  18. "size": 1000,
  19. "query": {
  20. "range": {
  21. "time": {
  22. "gte": "2020-12-20",
  23. "lte": "2020-12-21"
  24. }
  25. }
  26. },
  27. "sort": {"time": {"order": "asc"}}
  28. }
  29. result = es.search(index=index, body=query_json)["hits"]["hits"]

参考文献

1、ElasticSearch DSL 详解

2、elasticsearch DSL查询

3、Elasticsearch DSL 查询详解

4、Elasticsearch7.6中文文档

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/858969
推荐阅读
相关标签
  

闽ICP备14008679号