Elasticsearch(二)kibana数据检索
1.简述
有了数据学习使用kibana调用api检索数据,熟练kibana操作后再进一步使用spring data。
term
用于keyword类型数据精准查询,类似mysqlmatch
用于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}