elasticsearch之高亮查詢
前言
如果返回的結果集中很多符合條件的結果,那怎么能一眼就能看到我們想要的那個結果呢?比如下面網站所示的那樣,我們搜索elasticsearch
,在結果集中,將所有elasticsearch
高亮顯示?
如上圖我們搜索思否一樣。
我們該怎么做呢?
准備數據
PUT zhifou/doc/4
{
"name":"石頭",
"age":29,
"from":"gu",
"desc":"粗中有細,狐假虎威",
"tags":["粗", "大","猛"]
}
默認高亮顯示
我們來查詢:
GET zhifou/doc/_search
{
"query": {
"match": {
"name": "石頭"
}
},
"highlight": {
"fields": {
"name": {}
}
}
}
上例中,我們使用highlight
屬性來實現結果高亮顯示,需要的字段名稱添加到fields
內即可,elasticsearch
會自動幫我們實現高亮。
結果如下:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.5098256,
"hits" : [
{
"_index" : "zhifou",
"_type" : "doc",
"_id" : "4",
"_score" : 1.5098256,
"_source" : {
"name" : "石頭",
"age" : 29,
"from" : "gu",
"desc" : "粗中有細,狐假虎威",
"tags" : [
"粗",
"大",
"猛"
]
},
"highlight" : {
"name" : [
"<em>石</em><em>頭</em>"
]
}
}
]
}
}
上例中,elasticsearch
會自動將檢索結果用標簽包裹起來,用於在頁面中渲染。
自定義高亮顯示
但是,你可能會問,我不想用em
標簽, 我這么牛逼,應該用個b
標簽啊!好的,elasticsearch
同樣考慮到你很牛逼,所以,我們可以自定義標簽。
GET zhifou/chengyuan/_search
{
"query": {
"match": {
"from": "gu"
}
},
"highlight": {
"pre_tags": "<b class='key' style='color:red'>",
"post_tags": "</b>",
"fields": {
"from": {}
}
}
}
上例中,在highlight
中,pre_tags
用來實現我們的自定義標簽的前半部分,在這里,我們也可以為自定義的 標簽添加屬性和樣式。post_tags
實現標簽的后半部分,組成一個完整的標簽。至於標簽中的內容,則還是交給fields
來完成。
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.5753642,
"hits" : [
{
"_index" : "zhifou",
"_type" : "chengyuan",
"_id" : "1",
"_score" : 0.5753642,
"_source" : {
"name" : "老二",
"age" : 30,
"sex" : "male",
"birth" : "1070-10-11",
"from" : "gu",
"desc" : "皮膚黑,武器長,性格直",
"tags" : [
"黑",
"長",
"直"
]
},
"highlight" : {
"name" : [
"<b class='key' style='color:red'>老</b><b class='key' style='color:red'>二</b>"
]
}
}
]
}
}
需要注意的是:自定義標簽中屬性或樣式中的逗號一律用英文狀態的單引號表示,應該與外部elasticsearch
語法的雙引號區分開。
至此,基本的查詢,我們已經能勝任絕大數的應用場景。接下來我們來看一下更多關於結果處理的函數。
歡迎斧正,that's all