ToB企服应用市场:ToB评测及商务社交产业平台
标题:
大数据-176 Elasticsearch Query DSL - Filter DSL & 查询排序 & 效果高亮
[打印本页]
作者:
南飓风
时间:
2024-10-22 04:59
标题:
大数据-176 Elasticsearch Query DSL - Filter DSL & 查询排序 & 效果高亮
点一下关注吧!!!非常感谢!!持续更新!!!
目前已经更新到了:
Hadoop(已更完)
HDFS(已更完)
MapReduce(已更完)
Hive(已更完)
Flume(已更完)
Sqoop(已更完)
Zookeeper(已更完)
HBase(已更完)
Redis (已更完)
Kafka(已更完)
Spark(已更完)
Flink(已更完)
ClickHouse(已更完)
Kudu(已更完)
Druid(已更完)
Kylin(已更完)
Elasticsearch(正在更新…)
章节内容
上节我们完成了如下的内容:
Filter DSL
查询、排序
Filter DSL
基本先容
Filter DSL:过滤器查询语言)
Filter DSL 是 Elasticsearch 提供的一种用于构建过滤查询的方式。与 query 语句不同,过滤器不会盘算与文档相干的评分,而是简单地筛选出符合条件的文档。这通常用于只关心是否匹配而不思量匹配度的情况,如日志分析、数据分类等场景。Filter 查询更高效,得当不需要盘算相干性的操作。
实际利用
Elasticsearch中的全部的查询都会触发相干度得分盘算,对于那些不需要相干度得分的场景下,Elasticsearch以过滤器的情势提供了另一种查询功能,过滤器在概念上类似于查询,但是他们有非常快的实行速度,实行速度快主要有以下两个原因:
过滤器不会盘算相干度的得分,所以它们在盘算上更快一些
过滤器可以被缓存到内存中,这使得他在重复的搜索查询上,其要比相应的查询快的多
为了明白过滤器,可以将一个查询(像是match_all,match,bool等)和一个过滤器结合起来,我们以范围过滤器为例,它答应我们通过一个区间值来过滤文档,这通常被用在数字和日期的过滤上,下面这个例子利用一个被过滤的 查询,其返回值是200到1000之间(闭区间)的书:
POST /book/_search
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": {
"range": {
"price": {
"gte": 200,
"lte": 1000
}
}
}
}
}
}
复制代码
运行的效果如下图所示:
分解上面的例子,被过滤的查询包罗一个match_all查询和一个过滤器。可以在查询部门放入其他查询,在Filter部门放入其他过滤器,在上面的应用场景中,由于全部的在这个范围之内的文档都是平等的(相干度都一样),没有一个文档比另一个文档更相干。所以这个时间就要利用范围过滤器。
通常情况下,要决定利用过滤器照旧查询,你就需要问自己是否需要相干度得分,如果相干度不重要,那就利用过滤器,否则利用查询。查询和过滤器在概念上类似于SELECT WHERE语句。
查询排序
在 Elasticsearch 中,查询效果可以按不同的字段进行排序,默认情况下是按 _score(相干性得分)排序。如果想根据其他字段排序,比如时间戳或代价,可以通过在查询哀求中指定 sort 参数来完成。排序可以是升序(asc)或降序(desc),常用于电商、日志分析等需要按时间或数值排序的场景。
相干性评分
默认情况下,返回的效果都是按照相干性进行排序的,最相干的文档排在最前面,起首看看sort参数以及怎样利用它。
为了按照相干性来排序,需要将相干性表示为一个数值,在Elasticsearch中,相干性得分由一个浮点数进行表示,并在搜索效果中通过_score参数返回,默认排序是_score降序,按照相干性评分升序排序如下:
# 默认查询时的排序
POST /book/_search
{
"query": {
"match": {"description":"solr"}
}
}
复制代码
实行效果如下图所示:
字段值排序
# 按照 order 字段进行排序
POST /book/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
]
}
复制代码
实行的效果如下图所示:
多级排序
# 多种排序字段
POST /book/_search
{
"query":{
"match_all":{}
},
"sort": [
{ "price": {
"order": "desc"
}
},
{
"timestamp": {
"order": "desc"
}
}
]
}
复制代码
实行效果如下图所示:
分页查询
Elasticsearch分页的方式好坏常简单的:
# 分页查询
POST /book/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"price": {
"order": "desc"
}
}
],
"size": 2,
"from": 0
}
复制代码
实行效果如下图所示:
效果高亮
效果高亮功能用于在查询效果中突出表现匹配的关键词。当用户搜索特定的词时,Elasticsearch 可以在返回的文档中用
标签或其他 HTML 元素将匹配的关键词包裹起来,方便前端展示。这个功能常用于搜索引擎或全文检索的效果展示中,提升用户体验。
POST /book/_search
{
"query": {
"match": {
"name": "elasticsearch"
}
},
"highlight": {
"pre_tags": "<font color='pink'>",
"post_tags": "</font>",
"fields": [{"name":{}}]
}
}
复制代码
实行的效果如下图所示:
利用match 查询的同时,加上一个highlight属性:
pre_tags 前置标签
post_tags 后置标签
fields 需要高亮的字段,name这里声明title字段需要高亮
批量操作
Elasticsearch 提供了批量操作的 API,用于一次性实行多个操作,如插入、更新、删除等。这种批量操作可以显著进步处理大量数据的服从,淘汰与服务器的交互次数。Bulk API 在需要进行大规模数据处理或日志批量写入时非常有效。
批量查询
可以利用 mget 提供批量查询
单条查询ID的时间,比如很多个ID,一条一条的查询,网络开销好坏常大的。
# 批量查询
POST /_mget
{
"docs" : [
{
"_index" : "book",
"_id" : 1
},
{
"_index" : "book",
"_id" : 2
}
]
}
复制代码
运行的效果如下图所示:
同一索引批量查询
# book索引下检索
POST /book/_mget
{
"docs" : [
{
"_id" : 2
},
{
"_id" : 3
}
]
}
# 当然也有一个简化的写法
POST /book/_search
{
"query": {
"ids" : {
"values" : ["1", "4"]
}
}
}
复制代码
实行的效果如下图所示:
bulk 批量增删改
Bulk 操作表明将文档的增删改查一系列操作,通过一次哀求全部做完,淘汰网络的传输次数。
POST /_bulk
{"action": {"metadata"}}
{"data"}
复制代码
示例:
# 批量的操作,增删改查
POST /_bulk
{ "delete": { "_index": "book", "_id": "1" }}
{ "create": { "_index": "book", "_id": "5" }}
{ "name": "test14","price":100.99 }
{ "update": { "_index": "book", "_id": "2"} }
{ "doc" : {"name" : "test"} }
复制代码
功能:
delete 删除一个文档,只要1个JSON串就可以 删除的批量操作不需要哀求体
create 相当于强制创建 PUT /index/type/id/_create
index 普通的put操作,可以是创建文档,也可以是全量替换文档
update 实行的是局部更新partial update操作
格式:
每个JSON不能换行,相邻JSON换行
隔离:
每个操作互不影响,操作失败的行会返回其失败信息
实际用法:
bulk哀求一次不要太大,否则一下会挤压到内存中,性能会下降。
一次哀求几千个操作,大小在几M正好
bulk会将要处理的数据载入内存中,所以数据量是有限的,最佳的数据量不是一个确定的值。取决于你的硬件本领、文档复杂性、索引以及搜索的负载
一样平常发起1万-5万个文档,大小发起是15MB,默认不能超过100MB,可以在(ES) config/elasticsearch.yml中进行设置 http.max_content_length: 10mb
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4