Elasticsearch(二)kibana数据检索

Elasticsearch(二)kibana数据检索

1.简述

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

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

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

文档内容格式参考

js 复制代码
{
  "_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 查询,如下

text 复制代码
GET zb_notice/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "amount": 107000.4
        }
      }
    }
  }
}

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

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

js 复制代码
GET products/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "term": {
          "price": 20
        }
      }
    }
  }
}

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

text 复制代码
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,保障只返回我们想要的数据

js 复制代码
 "_source": [
    "showed_field1",
    "showed_field12"
  ],
  ---------------------------------------
 GET zb_notice/_search
    {
      "_source": [
        "amount",
        "scale"
      ],
      "query":{
        "match_all": {}
      },
      "size": 10000
    }
 
相关推荐
Dusk_橙子10 小时前
在elasticsearch中,document数据的写入流程如何?
大数据·elasticsearch·搜索引擎
喝醉酒的小白12 小时前
Elasticsearch 中,分片(Shards)数量上限?副本的数量?
大数据·elasticsearch·jenkins
熟透的蜗牛15 小时前
Elasticsearch 8.17.1 JAVA工具类
elasticsearch
九圣残炎18 小时前
【ElasticSearch】 Java API Client 7.17文档
java·elasticsearch·搜索引擎
risc12345621 小时前
【Elasticsearch】HNSW
elasticsearch
我的棉裤丢了21 小时前
windows安装ES
大数据·elasticsearch·搜索引擎
乙卯年QAQ1 天前
【Elasticsearch】RestClient操作文档
java·大数据·elasticsearch·jenkins
超级阿飞1 天前
利用Kubespray安装生产环境的k8s集群-实施篇
elasticsearch·容器·kubernetes
小诺大人2 天前
Docker 安装 elk(elasticsearch、logstash、kibana)、ES安装ik分词器
elk·elasticsearch·docker
forestsea2 天前
【Elasticsearch 】 聚合分析:桶聚合
大数据·elasticsearch·搜索引擎