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