ES查询之查询属性过滤、结果高亮显示

1|0一、Elasticsearch之查询字段过滤

1|11. 前言

  • 在未来,一篇文档可能有很多的字段,每次查询都默认给我们返回全部,在数据量很大的时候,是的,比如我只想查姑娘的手机号,你一并给我个喜好啊、三围什么的算什么?
  • 所以,我们对结果做一些过滤,清清白白的告诉elasticsearch
  • 对比数据库的select语句,前面介绍的查询都是相当于带where条件的 select * ,下面要介绍的就是相当于select 指定的一些字段了
  • 在数据量很大的时候,我们需要什么字段,就返回什么字段就好了,提高查询效率

1|22. 准备数据

PUT test1/_doc/1 { "name":"顾老二", "age":30, "from": "gu", "desc": "皮肤黑、武器长、性格直", "tags": ["黑", "长", "直"] }

1|33. 结果过滤:_source

  • 现在,在所有的结果中,我只需要查看nameage两个属性,其他的不要怎么办?
GET test1/_doc/_search { "query": { "match": { "name": "顾老二" } }, "_source": ["name", "age"] }
  • 如上例所示,在查询中,通过_source来控制仅返回nameage属性。
{ "took" : 8, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : [ { "_index" : "test1", "_type" : "doc", "_id" : "1", "_score" : 0.8630463, "_source" : { "name" : "顾老二", "age" : 30 } } ] } }

2|0二、Elasticsearch之高亮查询内容

2|11. 前言

  • 如果返回的结果集中很多符合条件的结果,那怎么能一眼就能看到我们想要的那个结果呢?比如下面网站所示的那样,我们搜索elasticsearch,在结果集中,将所有elasticsearch高亮显示?

[

  • 如上图我们搜索百度一样。我们该怎么做呢?

2|22. 准备数据

PUT test1/_doc/4 { "name":"石头", "age":29, "from":"gu", "desc":"粗中有细,狐假虎威", "tags":["粗", "大","猛"] }

2|33. 默认高亮显示

  • 我们来查询:
GET test1/_doc/_search { "query": { "match": { "name": "石头" } }, "highlight": { "fields": { "name": {} } } }
  • 上例中,我们使用highlight属性来实现结果高亮显示,需要的字段名称添加到fields内即可,elasticsearch会自动帮我们实现高亮。

  • 结果如下:

{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 1.5098256, "hits" : [ { "_index" : "test1", "_type" : "doc", "_id" : "4", "_score" : 1.5098256, "_source" : { "name" : "石头", "age" : 29, "from" : "gu", "desc" : "粗中有细,狐假虎威", "tags" : [ "粗", "大", "猛" ] }, "highlight" : { "name" : [ "<em>石</em><em>头</em>" ] } } ] } }
  • 上例中,elasticsearch会自动将检索结果用标签包裹起来,用于在页面中渲染。

2|44. 自定义高亮显示

  • 但是,你可能会问,我不想用em标签, 我这么牛逼,应该用个b标签啊!好的,elasticsearch同样考虑到你很牛逼,所以,我们可以自定义标签。
GET test1/chengyuan/_search { "query": { "match": { "from": "gu" } }, "highlight": { "pre_tags": "<b class='key' style='color:red'>", "post_tags": "</b>", "fields": { "from": {} } } }
  • 上例中,在highlight中,pre_tags用来实现我们的自定义标签的前半部分,在这里,我们也可以为自定义的标签添加属性和样式。post_tags实现标签的后半部分,组成一个完整的标签。至于标签中的内容,则还是交给fields来完成。
{ "took" : 1, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.5753642, "hits" : [ { "_index" : "test1", "_type" : "chengyuan", "_id" : "1", "_score" : 0.5753642, "_source" : { "name" : "老二", "age" : 30, "sex" : "male", "birth" : "1070-10-11", "from" : "gu", "desc" : "皮肤黑,武器长,性格直", "tags" : [ "黑", "长", "直" ] }, "highlight" : { "name" : [ "<b class='key' style='color:red'>老</b><b class='key' style='color:red'>二</b>" ] } } ] } }
  • 需要注意的是:自定义标签中属性或样式中的引号一律用英文状态的单引号表示,应该与外部elasticsearch语法的双引号区分开

__EOF__

本文作者BigSun丶
本文链接https://www.cnblogs.com/Mcoming/p/18123631.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   BigSun丶  阅读(834)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示