1. 概述

之前聊了一下 Elasticsearch(ES)的基本使用,今天我们聊聊 Elasticsearch(ES)的高级搜索(DSL搜索),由于DSL搜索内容比较多,因此分为两篇文章完成。

2. 场景说明

2.1 创建索引同时创建映射

PUT  http://192.168.1.11:9200/index_user

参数:

{
"settings":{
"index":{
"number_of_shards":5,
"number_of_replicas":0
}
},
"mappings" : {
"properties":{
"user_id":{
"type":"long"
},
"name":{
"type":"text",
"analyzer":"ik_max_word"
},
"login_name":{
"type":"keyword"
},
"age":{
"type":"integer"
},
"birthday":{
"type":"date"
},
"desc":{
"type":"text",
"analyzer":"ik_max_word"
},
"head_url":{
"type":"text",
"index":false
}
}
}
}

2.2 创建文档

此处只举几个例子

POST  http://192.168.1.11:9200/index_user/_doc/1

参数:

{
"user_id":"1",
"name":"僵尸猎手",
"login_name":"jsls",
"age":25,
"birthday":"1990-03-01",
"desc":"我是一名房产经纪人,现在转行了,目前是一名运输工人",
"head_url":"https://www.zhuifengren.cn/img/jsls.jpg"
}

POST  http://192.168.1.11:9200/index_user/_doc/2

参数:

{
"user_id":"2",
"name":"夏维尔",
"login_name":"xwe",
"age":28,
"birthday":"1992-06-06",
"desc":"我是一名高级开发经理,每天坐地铁上班,在北京住,从不堵车",
"head_url":"https://www.zhuifengren.cn/img/xwe.jpg"
}

POST  http://192.168.1.11:9200/index_user/_doc/3

参数:

{
"user_id":"3",
"name":"迪士尼在逃仙柔",
"login_name":"dsnzxr",
"age":10,
"birthday":"2011-06-22",
"desc":"我是一名五年级的小学生,每天专车接专车送,中午在学校入伙,食堂菜可好了,上学期期末考试我拿了三好学生奖",
"head_url":"https://www.zhuifengren.cn/img/dsnzxr.jpg"
}

……………………

3. 高级搜索(DSL搜索)(上篇)

3.1 在url中指定查询条件(非DSL搜索)

GET  http://192.168.1.11:9200/index_user/_doc/_search?q=desc:一名&q=age:10

desc 是索引中的一个字段,一名 是需要检索的关键字

age 是索引中的一个字段,10是要查的值

此方式用的比较少。

3.2 DSL基本查询

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match":{
"desc":"一名"
}
}
}

3.3 文档中是否存在某字段

文档中存在该字段,就会被查出来

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"exists":{
"field":"name"
}
}
}

3.4 查询所有 

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match_all":{}
}
}

3.5 查询部分字段

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match_all":{}
},
"_source": [
"user_id",
"name"
]
}

3.6 分页

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match_all":{}
},
"from":0, // 从哪条文档开始,文档下标从 0 开始
"size":10 // 每页多少条文档
}

 3.7 term查询

term查询,不会将关键字分词,直接拿来查询。

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"term":{
"desc":"一名"
}
}
}

3.8 match查询

match查询,会将关键字先分词,然后用每一个分词去查询,最后将结果取并集。

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match":{
"desc":"一名小学生"
}
}
}

3.9 terms查询

与term查询类似,可以写多个关键字,会用每个关键字去查询,最后将结果取并集。

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"terms":{
"desc":[
"一名",
"小学生"
]
}
}
}

3.10 match_phrase查询

与match类似,会先将关键字分词,然后用每个分词去查询,但会对文档中分词间的间隔有一定限制,使用slop属性去限制,默认是0,需要小于设置的间隔,才能匹配文档。

例如:slop设置为0,则两个分词在文档中的位置必须是紧挨着,否则无法命中。

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match_phrase":{
"desc":{
"query": "一名 学生",
"slop":8
}
}
}
}

3.11 match查询扩展

1)match查询后,结果取交集

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match":{
"desc": {
"query": "一名小学生",
"operator": "and"
}
}
}
}

2)指定匹配率

指定为整数,意思是文档匹配分词的最小个数,例如设置为3,意思是有关键字中3个分词命中文档就可以被查出来。

指定为百分比,意思是匹配关键字分词的百分比,例如设置为60%,如果关键字分词数量是4,则匹配的关键字分词数除以总数大于60%就可以被查出来。

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"match":{
"desc": {
"query": "一名小学生",
"minimum_should_match":"3" // 或 "minimum_should_match":"60%"

}
}
}
}

3.12 使用id集合查询

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query": {
"ids":{
"type":"_doc",
"values":["1","3"]
}
}
}

3.13 match的多字段查询

当字段名称写为  "name^10"时,意思是将 name 字段的权重提升10倍,则命中name的文档分数会高,排序会靠前。

POST  http://192.168.1.11:9200/index_user/_doc/_search

参数:

{
"query":{
"multi_match":{
"query":"一名小学生 僵尸",
"fields":[
"desc",
"name" // "name^10"
]
}
}
}

4. 综述

今天简单聊了一下 Elasticsearch(ES)的高级搜索(DSL搜索)的一部分内容,希望可以对大家的工作有所帮助。

欢迎大家帮忙点赞、评论、加关注 :)

关注追风人聊Java,每天更新Java干货。

Elasticsearch(ES)的高级搜索(DSL搜索)(上篇)的更多相关文章

  1. Elasticsearch(ES)的高级搜索(DSL搜索)(下篇)

    1. 概述 之前聊了Elasticsearch(ES)的高级搜索(DSL搜索)的一部分内容,今天把剩下的部分聊完. 2. 场景说明 2.1 创建索引同时创建映射 PUT  http://192.168 ...

  2. 分布式搜索ElasticSearch构建集群与简单搜索实例应用

    分布式搜索ElasticSearch构建集群与简单搜索实例应用 关于ElasticSearch不介绍了,直接说应用. 分布式ElasticSearch集群构建的方法. 1.通过在程序中创建一个嵌入es ...

  3. 在 Laravel 项目中使用 Elasticsearch 做引擎,scout 全文搜索(小白出品, 绝对白话)

    项目中需要搜索, 所以从零开始学习大家都在用的搜索神器 elasiticsearch. 刚开始 google 的时候, 搜到好多经验贴和视频(中文的, 英文的), 但是由于是第一次接触, 一点概念都没 ...

  4. es站内站内搜索笔记(一)

    es站内站内搜索笔记(一) 第一节: 概述 使用elasticsearch进行网站搜索,es是当下最流行的分布式的搜索引擎及大数据分析的中间件,搜房网的主要功能:强大的搜索框,与百度地图相结合,实现地 ...

  5. ElasticSearch(四):基本搜索

    ElasticSearch(四):基本搜索 学习课程链接<Elasticsearch核心技术与实战> URI Search 使用HTTP的GET方法,在URL中使用查询参数进行查询. GE ...

  6. 使用Elasticsearch中的copy_to来提高搜索效率

    在今天的这个教程中,我们来着重讲解一下如何使用Elasticsearch中的copy来提高搜索的效率.比如在我们的搜索中,经常我们会遇到如下的文档: { "user" : &quo ...

  7. 【转载】[Elasticsearch]ES入门

    传送门:http://www.cnblogs.com/xing901022 ES即简单又复杂,你可以快速的实现全文检索,又需要了解复杂的REST API.本篇就通过一些简单的搜索命令,帮助你理解ES的 ...

  8. solr和ElasticSearch(ES)的区别?

    Solr2004年诞生 ElasticSearch 2010年诞生 ES更新 ElasticSearch简介: ElasticSearch是一个实时的分布式的搜索引擎和分析引擎.它可以帮助你用前所未有 ...

  9. Elasticsearch(es)介绍与安装

    ### RabbitMQ从入门到集群架构: https://zhuanlan.zhihu.com/p/375157411 可靠性高 ### Kafka从入门到精通: https://zhuanlan. ...

随机推荐

  1. 服务启动shell脚本

    #!/bin/sh JarDir=`pwd` do_start() { echo "pandora-login start ..." nohup java -jar -Xmn256 ...

  2. PHPMailer 远程命令执行漏洞 Writeup

    漏洞概述 1.漏洞简介 PHPMailer 小于5.2.18的版本存在远程代码执行漏洞.成功利用该漏洞后,攻击者可以远程任意代码执行.许多知名的 CMS 例如 Wordpress 等都是使用这个组件来 ...

  3. DVWA靶场之File Inclusion(文件包含)通关

    文件包含,未经过严格过滤,将一些恶意构造带入了包含函数,可以使用一些包含函数来包含一些其他乱七八糟的东西,要么导致任意文件读取,要么命令执行 文件包含包括远程文件包含(RFI)和本地文件包含(LFI) ...

  4. Python 可变数据类型与不可变数据类型

    浅拷贝和深拷贝 Python数据都是存放到内存中的,Python的数据又分为可变和不可以变 可变数据(修改了值后,不会改变内存地址,修改的值还是指向相同的内存地址) 字典 # 列表是可变 x = [1 ...

  5. JavaWeb学习笔记(五)

    本文内容 1. JSP: 1. 指令 2. 注释 3. 内置对象 2. MVC开发模式 3. EL表达式 4. JSTL标签 5. 三层架构 JSP: 1. 指令 * 作用:用于配置JSP页面,导入资 ...

  6. Unity遮罩之Mask、RectMask2D与Sprite Mask适用场景分析

    遮罩,顾名思义是一种可以掩盖其它元素的控件.常用于修改其它元素的外观,或限制元素的形状.比如ScrollView或者圆头像效果都有用到遮罩功能.本系列文章希望通过阅读UGUI源码的方式,来探究遮罩的实 ...

  7. 【ArcEngine】AE连接SDE_For_SQLServer参数设置

    SDE for sqlserver直连的ArcEngine访问 Ae中的数据的连接实质还是采用服务连接的方式.连接代码如下: 1 public IWorkspace Getworkspace() 2 ...

  8. ObjectInputStream和ObjectOutputStream

    package stream.object; import java.io.FileInputStream; import java.io.FileOutputStream; import java. ...

  9. k8s 探针 exec多个判断条件条件 多个检测条件

    背景 1,之前我们的yaml文件里面有就绪探针. 2,探针是检测一个文件是否生成,生成了说明服务正常. 3,现在要加一个检测,也是一个文件是否存在并且不为空. 4,只有两个条件同时满足了 服务才算正常 ...

  10. Linux centos7 复制,移动,删除文件或文件夹

    2021-08-121. 文件(文件夹)复制命令 # 命令格式 cp [-adfilprsu] 源文件(source) 目标文件(destination) cp [option] source1 so ...