当前位置: 首页 > news >正文

ElasticSearch7.x入门教程之全文搜索(五)

文章目录

  • 前言
  • 一、全文查询:match query
  • 二、词项查询:term query
  • 三、范围查询:range query
  • 四、ids集合查询
  • 总结


前言

搜索是 ElasticSearch 最为丰富有趣的功能,也是平常在工作当中用得最多的地方。

我相信,基本上也只是用到ES的搜索,比如全文查询、词项查询、复合查询、嵌套查询、位置查询、特殊查询等等。

案例用的数据,是自己通过SpringData导入的,后面再来记录结合Java使用。
索引building_info(建筑地址索引)的mapping如下:

"mappings" : {"properties" : {"_class" : {"type" : "text","fields" : {"keyword" : {"type" : "keyword","ignore_above" : 256}}},"address" : { # 搜索的全名地址"type" : "text","analyzer" : "ik_smart"},"city_code" : { # 市"type" : "keyword"},"county" : {"type" : "keyword"},"create_time" : {"type" : "date"},"floor" : { # 楼层"type" : "keyword"},"id" : {"type" : "long"},"name" : { # 简称地址"type" : "text","analyzer" : "ik_smart"},"town_office" : { # 街道办事处"type" : "text","analyzer" : "ik_smart"},"type" : { # 房屋类型(城市住宅等)"type" : "keyword"}}}

一、全文查询:match query

  • 1、简单搜索,不写查询条件,查询所有,默认查询 前10 条记录。
GET /building_info/_search
{"query": {"match_all": {}}
}# 或者
GET /building_info/_search
  • 2、分页查询,只写分页参数,es 中也可以像关系型数据库一样,给一个分页参数,指定from参数和size参数。但是es中,默认最大跨度为10000条;查询到越是后面的数据,会出现深度分页问题,官方推荐就不能这样查询了,后面再来记录官网推荐的,解决深度分页问题
GET /building_info/_search
{"query": {"match_all": {}},"from": 0, "size": 20
}
  • 3、查询结果过滤返回字段
GET /building_info/_search
{"query": {"match_all": {}},"_source": ["name","address","city_code"]
}
  • 4、文档数的最小评分,有的文档得分特别低,说明这个文档和我们查询的关键字相关度很低。我们可以设置一个最低分,只有得分超过最低分的文档才会被返回。
GET /building_info/_search
{"query": {"match_all": {}},"min_score": 1.25
}
  • 5、根据关键字查询
GET /building_info/_search
{"query": {"match": {"address": "草堂北路"}}
}

先对草堂北路进行ik_smart分词,分解成草堂北路,分词之后,再去查询。
只要文档中包含一个分词结果,就回返回文档。换句话说,默认词项之间是 or 的关系,如果想要修改,也可以改为and

GET /building_info/_search
{"query": {"match": {"address": {"query": "草堂北路","operator": "and"}}}
}

此时就回要求文档中必须同时包含草堂北路两个词。

  • 6、查询关键字高亮
    在这里插入图片描述默认是<em>标签,可以修改。
"highlight": {"fields": {"address": {"pre_tags": "<bold>","post_tags": "</bold>"}}}

有的时候,虽然我们是在 address字段中搜索的,但是我们希望 town_office字段中,相关的关键字也能高亮:

GET /building_info/_search
{"query": {"match": {"address": "草堂街道办事处"}},"highlight": {"require_field_match": "false", "fields": {"address": {},"town_office": {}} }
}

结果如下:
在这里插入图片描述

  • 7、查询结果排序
    排序很简单,默认是按照查询文档的相关度来排序的,即(_score 字段):
GET /building_info/_search# 等价于
GET /building_info/_search
{"sort": [{"_score": {"order": "desc"}}]
}

然后,match_all 查询只是返回所有文档,不评分,默认按照添加顺序返回,可以通过 _doc 字段对其进行排序:

GET /building_info/_search
{"query": {"match_all": {}}, "sort": [{"_score": {"order": "desc"}}],"size": 5
}

es 同时也支持多字段排序:

GET /building_info/_search
{"query": {"match_all": {}}, "sort": [{"_score": {"order": "desc"}}, {"create_time": {"order": "desc"}}],"size": 5
}

二、词项查询:term query

  • 1、单个词项查询
    就是根据词去查询,查询指定字段中包含给定单词的文档,term 查询不被分词,只有搜索的词和文档中的词精确匹配,才会返回文档。应用场景如:人名、地名等等。

比如:查询 type等于城市住宅的文档:

GET /building_info/_search
{"query": {"term": {"type": "城市住宅"}}
}

结果如下:
在这里插入图片描述
词项term可以添加的参数和全文match查询添加的参数大致一样,我这边就不测试了。

  • 2、多个关键词查询
GET /building_info/_search
{"query": {"terms": {"name": ["城市住宅", "城市住宅房", "别墅"]}}
}

三、范围查询:range query

范围查询,可以按照日期范围、数字范围等查询。

range query 中的参数主要有四个:gtltgtelte
案例:

# 楼层为大于20层,小于25GET /building_info/_search
{"query": {"range": {"floor": {"gte": 20,"lte": 25}}}
}

四、ids集合查询

这种情况下,可以传递一个id集合,优化查询。

GET /building_info/_search
{"query": {"ids": {"values": [36636, 36637, 36638]}}
}

总结

记录在工作当中会用到的情形,如果有新遇到的会再次添加。


http://www.mrgr.cn/news/78540.html

相关文章:

  • 配置DAQmx驱动支持多个LabVIEW版本
  • 分布式锁的实现方案有哪些?各自的原理是怎样的?使用场景有哪些?与单体架构中锁区别?存在哪些问题?如何解决?注意事项?
  • 详解Rust泛型用法
  • 单片机知识总结(完整)
  • JavaScript学习总结
  • Three.js渲染较大的模型之解决方案
  • QT知识整理
  • 快速理解微服务中Ribbon的概念
  • C7.【C++ Cont】范围for的使用和auto关键字
  • 深度学习基础3
  • Android Studio安装TalkX AI编程助手
  • 性能监控系统Prometheus、Node-exporter与Grafana部署详解搭建
  • 网络原理(一)—— http
  • 虚拟机ubuntu-20.04.6-live-server搭建OpenStack:Victoria(三:安装服务-controller node)
  • OceanBase 大数据量导入(obloader)
  • React第十节组件之间传值之context
  • SpringBoot实战(三十二)集成 ofdrw,实现 PDF 和 OFD 的转换、SM2 签署OFD
  • 【Electron学习笔记(二)】基于Electron开发应用程序
  • 算法基础 - 求解非线性方程(二分迭代法)
  • 超级详细讲解转义字符,\? \‘ \f \0 \t等等!!!
  • 【科研】9如何高效阅读和理解学术论文
  • C++ 类(Class)
  • Web Worker 和 WebSocket的区别
  • 跨平台应用开发框架(3)-----Qt(样式篇)
  • 自动控制原理——BliBli站_DR_CAN
  • python学习——元组的创建于删除