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"
      }
    ]
  }
}

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": "城南实验中学校园消防管道修缮工程项目工程监理"
        }
    }
}

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

2.数字/金额

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

GET zb_notice/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "amount": 107000.4
        }
      }
    }
  }
}

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

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

GET products/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "price": 20
        }
      }
    }
  }
}

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

GET zb_notice/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "amount": {
            "gte": 100000,
            "lte": 220000
          }
        }
      }
    }
  }
}

range 支持的选项

gt:大于(greater than)

gte:大于等于(greater than or equal)

lt::小于(less than)

lte:小于等于(less than or equal)

eq:等于(equal)

neq:不等于

4.时间类型

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

  • 范围时间查询
POST zb_notice/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "startTime": {
            "gte": "2023-08-25",
            "lte": "2023-08-30"
          }
        }
      }
    }
  }
}
  • 时间查询
POST zb_notice/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "startTime": {
            "gte": "2023-08-25"
          }
        }
      }
    }
  }
}

5.列表类型

当数据结构是一个列表

//多值查询
GET zb_notice/_search
{
  "query": {
    "terms": {
      "typeCodes": ["021", "022", "023"]
    }
  }
}
 

6.页数量设置

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

 GET zb_notice/_search
{
  "query": {
    "terms": {
      "typeCodes": ["021", "022", "005"]
    }
  },
     "size": 10000
}

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

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

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

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

原因分析:

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
	}

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

8.仅返回需要的字段

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

 "_source": [
    "showed_field1",
    "showed_field12"
  ],
  ---------------------------------------
 GET zb_notice/_search
    {
      "_source": [
        "amount",
        "scale"
      ],
      "query":{
        "match_all": {}
      },
      "size": 10000
    }
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值