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