Elasticsearch(ES)的高级搜索(DSL搜索)(下篇
1. 概述
之前聊了Elasticsearch(ES)的高级搜索(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 布尔查询
参数中可以包含多种条件的组合。
其中 must 块下的条件,文档必须都符合才会被查出来。
must_not 块下的条件,文档必须都不符合才会被查出来。
should 块下的条件,文档只要符合一个就能被查出来。
最终结果集是 must、must_not、should 块查询结果的交集。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{
"query": {
"bool": {
"must": [
{
"match": {
"desc": "一名"
}
},
{
"match": {
"desc": "小学生"
}
}
],
"must_not": [],
"should": [
{
"match": {
"desc": "一名"
}
},
{
"match": {
"desc": "小学生"
}
}
]
}
}
}
3.2 布尔查询,为某个查询加权
命中加权查询项的文档,分数会提高
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{
"query": {
"bool": {
"should": [
{
"match": {
"desc": {
"query": "一名",
"boost":10
}
}
},
{
"match": {
"desc": "小学生"
}
}
]
}
}
}
3.3 结果集过滤
从ES查询后,再将结果集过滤一次。
支持范围查询:
gte:大于等于
lte:小于等于
gt:大于
lt:小于
也支持 term、match 操作。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{
"query":{
"match":{
"desc":"一名"
}
},
"post_filter": {
"range" : {
"age": {
"gt":10,
"lt":26
}
}
}
}
3.4 自定义排序
文本类型的字段,只能对keyword类型的文本字段排序,text类型的不能用于排序。
文本类型字段定义时,可以既是text类型,又是keyword类型,排序时使用 字段.keyword 进行排序。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{
"query":{
"match":{
"desc":"一名"
}
},
"sort":[
{
"age":"desc"
},
{
"user_id":"asc"
},
{
"login_name":"asc"
}
]
}
3.5 高亮
高亮效果就是在匹配的关键字上增加标签,便于前端去高亮显示。
POST http://192.168.1.11:9200/index_user/_doc/_search
参数:
{
"query":{
"match":{
"desc":"一名小学生"
}
},
"highlight":{
"pre_tags":"<span>",
"post_tags":"</span>",
"fields":{
"desc":{}
}
}
}
4. 综述
今天简单聊了一下 Elasticsearch(ES)的高级搜索(DSL搜索)剩下的部分,希望可以对大家的工作有所帮助。
欢迎帮忙点赞、评论、加关注 :)
关注追风人聊Java,每天更新Java干货。