大数据-176 Elasticsearch Query DSL - Filter DSL & 查询排序 & 效果高亮 ...

打印 上一主题 下一主题

主题 822|帖子 822|积分 2466

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:



  • 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之间(闭区间)的书:
  1. POST /book/_search
  2. {
  3.   "query": {
  4.     "bool": {
  5.       "must": {
  6.         "match_all": {}
  7.       },
  8.       "filter": {
  9.         "range": {
  10.           "price": {
  11.             "gte": 200,
  12.             "lte": 1000
  13.           }
  14.         }
  15.       }
  16.     }
  17.   }
  18. }
复制代码
运行的效果如下图所示:

分解上面的例子,被过滤的查询包罗一个match_all查询和一个过滤器。可以在查询部门放入其他查询,在Filter部门放入其他过滤器,在上面的应用场景中,由于全部的在这个范围之内的文档都是平等的(相干度都一样),没有一个文档比另一个文档更相干。所以这个时间就要利用范围过滤器。
通常情况下,要决定利用过滤器照旧查询,你就需要问自己是否需要相干度得分,如果相干度不重要,那就利用过滤器,否则利用查询。查询和过滤器在概念上类似于SELECT WHERE语句。
查询排序

在 Elasticsearch 中,查询效果可以按不同的字段进行排序,默认情况下是按 _score(相干性得分)排序。如果想根据其他字段排序,比如时间戳或代价,可以通过在查询哀求中指定 sort 参数来完成。排序可以是升序(asc)或降序(desc),常用于电商、日志分析等需要按时间或数值排序的场景。
相干性评分

默认情况下,返回的效果都是按照相干性进行排序的,最相干的文档排在最前面,起首看看sort参数以及怎样利用它。
为了按照相干性来排序,需要将相干性表示为一个数值,在Elasticsearch中,相干性得分由一个浮点数进行表示,并在搜索效果中通过_score参数返回,默认排序是_score降序,按照相干性评分升序排序如下:
  1. # 默认查询时的排序
  2. POST /book/_search
  3. {
  4.   "query": {
  5.     "match": {"description":"solr"}
  6.   }
  7. }
复制代码
实行效果如下图所示:

字段值排序

  1. # 按照 order 字段进行排序
  2. POST /book/_search
  3. {
  4.   "query": {
  5.     "match_all": {}
  6.   },
  7.   "sort": [
  8.     {
  9.       "price": {
  10.         "order": "desc"
  11.       }
  12.     }
  13.   ]
  14. }
复制代码
实行的效果如下图所示:

多级排序

  1. # 多种排序字段
  2. POST /book/_search
  3. {
  4.   "query":{
  5.     "match_all":{}
  6.   },
  7.   "sort": [
  8.     { "price": {
  9.       "order": "desc"
  10.     }
  11.     },
  12.     {
  13.       "timestamp": {
  14.         "order": "desc"
  15.       }
  16.     }
  17.   ]
  18. }
复制代码
实行效果如下图所示:

分页查询

Elasticsearch分页的方式好坏常简单的:
  1. # 分页查询
  2. POST /book/_search
  3. {
  4.   "query": {
  5.     "match_all": {}
  6.   },
  7.   "sort": [
  8.     {
  9.       "price": {
  10.         "order": "desc"
  11.       }
  12.     }
  13.   ],
  14.   "size": 2,
  15.   "from": 0
  16. }
复制代码
实行效果如下图所示:

效果高亮

效果高亮功能用于在查询效果中突出表现匹配的关键词。当用户搜索特定的词时,Elasticsearch 可以在返回的文档中用 标签或其他 HTML 元素将匹配的关键词包裹起来,方便前端展示。这个功能常用于搜索引擎或全文检索的效果展示中,提升用户体验。
  1. POST /book/_search
  2. {
  3.   "query": {
  4.     "match": {
  5.       "name": "elasticsearch"
  6.     }
  7.   },
  8.   "highlight": {
  9.     "pre_tags": "<font color='pink'>",
  10.     "post_tags": "</font>",
  11.     "fields": [{"name":{}}]
  12.   }
  13. }
复制代码
实行的效果如下图所示:

利用match 查询的同时,加上一个highlight属性:


  • pre_tags 前置标签
  • post_tags 后置标签
  • fields 需要高亮的字段,name这里声明title字段需要高亮
批量操作

Elasticsearch 提供了批量操作的 API,用于一次性实行多个操作,如插入、更新、删除等。这种批量操作可以显著进步处理大量数据的服从,淘汰与服务器的交互次数。Bulk API 在需要进行大规模数据处理或日志批量写入时非常有效。
批量查询

可以利用 mget 提供批量查询
单条查询ID的时间,比如很多个ID,一条一条的查询,网络开销好坏常大的。
  1. # 批量查询
  2. POST /_mget
  3. {
  4.   "docs" : [
  5.     {
  6.       "_index" : "book",
  7.       "_id" : 1
  8.     },
  9.     {
  10.       "_index" : "book",
  11.       "_id" : 2
  12.     }
  13.   ]
  14. }
复制代码
运行的效果如下图所示:

同一索引批量查询

  1. # book索引下检索
  2. POST /book/_mget
  3. {
  4.   "docs" : [
  5.     {
  6.       "_id" : 2
  7.     },
  8.     {
  9.       "_id" : 3
  10.     }
  11.   ]
  12. }
  13. # 当然也有一个简化的写法
  14. POST /book/_search
  15. {
  16.   "query": {
  17.     "ids" : {
  18.       "values" : ["1", "4"]
  19.     }
  20.   }
  21. }
复制代码
实行的效果如下图所示:

bulk 批量增删改

Bulk 操作表明将文档的增删改查一系列操作,通过一次哀求全部做完,淘汰网络的传输次数。
  1. POST /_bulk
  2. {"action": {"metadata"}}
  3. {"data"}
复制代码
示例:
  1. # 批量的操作,增删改查
  2. POST /_bulk
  3. { "delete": { "_index": "book", "_id": "1" }}
  4. { "create": { "_index": "book", "_id": "5" }}
  5. { "name": "test14","price":100.99 }
  6. { "update": { "_index": "book", "_id": "2"} }
  7. { "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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

南飓风

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表