松哥原创的 Spring Boot 视频教程已经杀青,感兴趣的小伙伴戳这里-->Spring Boot+Vue+微人事视频教程
最近一两周,松哥会一直和大家分享 Es 中的搜索、聚合分析等查询相关的内容。前面我们简单说了下搜索入门,今天我们就来看看 Es 中的全文查询。
本文是ElasticSearch 系列第 19 篇,和大家聊一聊索引的基本操作,前 18 篇传送门:
-
打算出一个 ElasticSearch 教程,谁赞成,谁反对?
-
ElasticSearch 从安装开始
-
ElasticSearch 第三弹,核心概念介绍
-
ElasticSearch 中的中文分词器该怎么玩?
-
ElasticSearch 索引基本操作
-
ElasticSearch 文档的添加、获取以及更新
-
ElasticSearch 文档的删除和批量操作
-
ElasticSearch 文档路由,你的数据到底存在哪一个分片上?
-
ElasticSearch 并发的处理方式:锁和版本控制
-
ElasticSearch 中的倒排索引到底是什么?
-
ElasticSearch 动态映射与静态映射
-
ElasticSearch 四种字段类型详解
-
ElasticSearch 中的地理类型和特殊类型
-
ElasticSearch 23 种映射参数详解
-
ElasticSearch 如何配置某个字段的权重?
-
ElasticSearch 23 种映射参数详解【3】
-
ElasticSearch 映射模版
-
ElasticSearch 搜索入门
全文查询:
如果大家觉得视频风格还能接受,也可以看看松哥的付费视频:Spring Boot+Vue+微人事视频教程
以下是视频笔记:
注意,笔记只是视频内容的一个简要记录,因此笔记内容比较简单,完整的内容可以查看视频。
15.ElasticSearch 全文查询
15.1 match query
match query 会对查询语句进行分词,分词后,如果查询语句中的任何一个词项被匹配,则文档就会被索引到。
GET books/_search
{
"query": {
"match": {
"name": "美术计算机"
}
}
}
这个查询首先会对 美术计算机
进行分词,分词之后,再去查询,只要文档中包含一个分词结果,就回返回文档。换句话说,默认词项之间是 OR 的关系,如果想要修改,也可以改为 AND。
GET books/_search
{
"query": {
"match": {
"name": {
"query": "美术计算机",
"operator": "and"
}
}
}
}
此时就回要求文档中必须同时包含 美术 和 计算机 两个词。
15.2 match_phrase query
match_phrase query 也会对查询的关键字进行分词,但是它分词后有两个特点:
-
分词后的词项顺序必须和文档中词项的顺序一致
-
所有的词都必须出现在文档中
示例如下:
GET books/_search
{
"query": {
"match_phrase": {
"name": {
"query": "十一五计算机",
"slop": 7
}
}
}
}
query 是查询的关键字,会被分词器进行分解,分解之后去倒排索引中进行匹配。
slop 是指关键字之间的最小距离,但是注意不是关键之间间隔的字数。文档中的字段被分词器解析之后,解析出来的词项都包含一个 position 字段表示词项的位置,查询短语分词之后 的 position 之间的间隔要满足 slop 的要求。
15.3 match_phrase_prefix query
这个类似于 match_phrase query,只不过这里多了一个通配符,match_phrase_prefix 支持最后一个词项的前缀匹配,但是由于这种匹配方式效率较低,因此大家作为了解即可。
GET books/_search
{
"query": {
"match_phrase_prefix": {
"name": "计"
}
}
}
这个查询过程,会自动进行单词匹配,会自动查找以计开始的单词,默认是 50 个,可以自己控制:
GET books/_search
{
"query": {
"match_phrase_prefix": {
"name": {
"query": "计",
"max_expansions": 3
}
}
}
}
match_phrase_prefix 是针对分片级别的查询,假设 max_expansions 为 1,可能返回多个文档,但是只有一个词,这是我们预期的结果。有的时候实际返回结果和我们预期结果并不一致,原因在于这个查询是分片级别的,不同的分片确实只返回了一个词,但是结果可能来自不同的分片,所以最终会看到多个词。
15.4 multi_match query
match 查询的升级版,可以指定多个查询域:
GET books/_search
{
"query": {
"multi_match": {
"query": "java",
"fields": ["name","info"]
}
}
}
这种查询方式还可以指定字段的权重:
GET books/_search
{
"query": {
"multi_match": {
"query": "阳光",
"fields": ["name^4","info"]
}
}
}
这个表示关键字出现在 name 中的权重是出现在 info 中权重的 4 倍。
15.5 query_string query
query_string 是一种紧密结合 Lucene 的查询方式,在一个查询语句中可以用到 Lucene 的一些查询语法:
GET books/_search
{
"query": {
"query_string": {
"default_field": "name",
"query": "(十一五) AND (计算机)"
}
}
}
15.6 simple_query_string
这个是 query_string 的升级,可以直接使用 +、|、- 代替 AND、OR、NOT 等。
GET books/_search
{
"query": {
"simple_query_string": {
"fields": ["name"],
"query": "(十一五) + (计算机)"
}
}
}
查询结果和 query_string。
1
50+ 需求文档免费下载!
2
Spring Security 教程合集
3
接了两个私活,都是血汗钱
本文分享自微信公众号 - 江南一点雨(a_javaboy)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。