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干货。