• Elasticsearch(二)kibana数据检索


    Elasticsearch(二)kibana数据检索

    1.简述

    有了数据学习使用kibana调用api检索数据,熟练kibana操作后再进一步使用spring data。

    • term用于keyword类型数据精准查询,类似mysql
    • match 用于text类型数据分词查询,倒排索引

    首先针对keyword文本类型查询学习,类似于Mysql对字段的查询。

    文档内容格式参考

    {
      "_index" : "zb_notice",
      "_type" : "_doc",
      "_id" : "4451224572914342308301065",
      "_score" : 1.0,
      "_source" : {
        "_class" : "NoticeEntity",
        "id" : "111",
        "url" : "https://xxxxxx/purchaseNotice/view/111?",
        "owner" : "河管养所",
        "procurementName" : "工程建筑",
        "procurementNameText" : "应急抢险配套工程建筑",
        "intermediaryServiceMatters" : "无(属于非行政管理的中介服务项目采购)",
        "investmentApprovalProject" : "是",
        "code" : "789456",
        "scale" : 3.167183E8,
        "scaleText" : "投资额(¥316,718,300.00元)",
        "area" : "",
        "requiredServices" : "工程建筑",
        "typeCodes" : [
          "021"
        ],
        "context" : "是一座具有灌溉 、供水 、排洪 、交通和挡潮蓄淡等多功能的大(2)型水闸工程,承担黄冈河下游 8.65 万亩农田的灌溉任务并",
        "timeLimit" : "具体时限以合同条款约定为准。",
        "amount" : 0.0,
        "amountText" : "暂不做评估与测算",
        "amountDescription" : "",
        "selectIntermediaryType" : "直接选取",
        "isChooseIntermediary" : "否",
        "isAvoidance" : "否",
        "endTime" : "2023-09-04 09:30:00",
        "startTime" : "2023-08-31",
        "files" : [
          {
            "fileName" : "东溪水闸初设批复(1).pdf",
            "url" : "/aa/bb/file/downloadfile/PjAttachment/123456"
          }
        ]
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    2.基础概念

    • 结构化搜索是指对结构化的数据进行搜索。比如日期、时间和数字都是结构化的,它们有精确的格式,我们可以对这些格式进行逻辑操作。比较常见的操作包括比较数字或时间的范围、判定两个值的大小、前缀匹配等。

    • 打分在结构化查询中会影响数据排序,我们得到的结果只有“是”或“否”两个值,可以根据场景需要,决定结构化搜索是否需要打分,但通常我们是不需要打分的。

    term-条件查询,Elasticsearch 中的结构化搜索,即面向数值、日期、时间、布尔等类型数据的搜索,这些数据类型格式精确,通常使用基于词项的term精确匹配或者prefix前缀匹配。

    1.term查询
    • term查询是完全匹配
    • term查询不会再进行分词,而是直接去分词库进行完全匹配查询;
    2.terms 特点
    • 查询某个字段里含有多个关键词的文档
    • 相对于term来,terms是在针对一个字段包含多个值的时候使用
    • 通俗来说就是term查询一次可以匹配一个条件,terms一个可以匹配多个条件;

    3.数据类型查询

    1.字符串检索

    需要注意的是term查询的字段必须带上keyword,不然查询为空!

    GET zb_notice/_search
    {
        "query": {
            "term": {
                "procurementName.keyword": "城南实验中学校园消防管道修缮工程项目工程监理"
            }
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    “procurementName.keyword”中的“keyword”不是关键字,而是Elasticsearch在插入文档的时候,自动为“procurementName”生成的子字段,名字是“keyword”。

    2.数字/金额

    现在我们想要做的是查找具有某个价格的所有产品,假设我们要获取价格是20元的商品,我们可以使用 term 查询,如下

    GET zb_notice/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "amount": 107000.4
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    通常查找一个精确值的时候,我们不希望对查询进行评分计算。只希望对文档进行包括或排除的计算,所以我们会使用 constant_score 查询以非评分模式来执行 term 查询并以1.0作为统一评分。

    最终组合的结果是一个 constant_score 查询,它包含一个 term 查询:

    GET products/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "term": {
              "price": 20
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    对于数字,一般还有范围查询

    GET zb_notice/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "range": {
              "amount": {
                "gte": 100000,
                "lte": 220000
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    range 支持的选项

    gt:大于(greater than)
    
    gte:大于等于(greater than or equal)
    
    lt::小于(less than)
    
    lte:小于等于(less than or equal)
    
    eq:等于(equal)
    
    neq:不等于
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    4.时间类型

    比较通用的是时间范围查询

    • 范围时间查询
    POST zb_notice/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "range": {
              "startTime": {
                "gte": "2023-08-25",
                "lte": "2023-08-30"
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 时间查询
    POST zb_notice/_search
    {
      "query": {
        "constant_score": {
          "filter": {
            "range": {
              "startTime": {
                "gte": "2023-08-25"
              }
            }
          }
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5.列表类型

    当数据结构是一个列表

    //多值查询
    GET zb_notice/_search
    {
      "query": {
        "terms": {
          "typeCodes": ["021", "022", "023"]
        }
      }
    }
     
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    6.页数量设置

    当测试查询数据时,发现数据可能有100条,但是ES默认返回只有10条,可以设置size查看更多数据

     GET zb_notice/_search
    {
      "query": {
        "terms": {
          "typeCodes": ["021", "022", "005"]
        }
      },
         "size": 10000
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    7.其他方面-最大返回数限制

    es默认查询1W条数据,也就是说超过

    Elasticsearch官方默认限制索引查询最多只能查询10000条数据,查询第10001条数据开始就会报错:

    Result window is too large, from + size must be less than or equal to
    
    • 1

    原因分析:

    es对from + size的大小进行限制,必须小于等于10000。

    解决方案:
    在业务中限制分页大小,使from+size<=10000;
    动态更改索引设置,为max_result_window参数赋值足够大的值;
    es默认最大返回数是10000,支持的最大返回数是2^31-1,也就是2147483647,不建议设置太大,query数据时size不要太大,总得考虑内存消耗的,设置了返回max后可以用分页获取, from:num_a, size:num_b,获取的就是num_a+1到num_a+num_b的数据

    但是很多时候10000数据不能满足项目的需求,所以我们就要解除这个限制。

    解决方案:
    第一种办法:

    在restful请求时,解除索引最大查询数的限制

    put _all/_settings
    	{
    	"index.max_result_window":200000
    	}
    
    • 1
    • 2
    • 3
    • 4

    _all表示所有索引,如果针对单个索引的话修改成索引名称即可!!!

    8.仅返回需要的字段

    当文档对象太多,影响数据查看效果,可以使用_source,保障只返回我们想要的数据

     "_source": [
        "showed_field1",
        "showed_field12"
      ],
      ---------------------------------------
     GET zb_notice/_search
        {
          "_source": [
            "amount",
            "scale"
          ],
          "query":{
            "match_all": {}
          },
          "size": 10000
        }
     
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    【每日一题】50. Pow(x, n)
    ChartDirector 7.1.0 for VB Crack
    2核2G3M带宽云服务器99元(续费同价),阿里云老用户可买!
    散列表(哈希表)概述
    医院检验科LIS系统源码,oracle数据库、报告管理、质控管理
    地球重力场模型EGM2008使用教程及软件
    Java毕业设计-校园二手市场平台系统
    精简 jre 涉坑记录
    【Rust日报】2023-09-14 - 推进 `async fn` 稳定化
    There is no getter for property
  • 原文地址:https://blog.csdn.net/qq_42583549/article/details/132654109