目錄
- 一、Elasticsearch之查詢欄位過濾
- 1. 前言
- 2. 準備資料
- 3. 結果過濾:_source
- 二、Elasticsearch之高亮查詢內容
- 1. 前言
- 2. 準備資料
- 3. 預設高亮顯示
- 4. 自定義高亮顯示
一、Elasticsearch之查詢欄位過濾
1. 前言
- 在未來,一篇文件可能有很多的欄位,每次查詢都預設給我們返回全部,在資料量很大的時候,是的,比如我只想查姑娘的手機號,你一併給我個喜好啊、三圍什麼的算什麼?
- 所以,我們對結果做一些過濾,清清白白的告訴elasticsearch
- 對比資料庫的select語句,前面介紹的查詢都是相當於帶where條件的 select * ,下面要介紹的就是相當於select 指定的一些欄位了
- 在資料量很大的時候,我們需要什麼欄位,就返回什麼欄位就好了,提高查詢效率
2. 準備資料
PUT test1/doc/1
{
"name":"顧老二",
"age":30,
"from": "gu",
"desc": "皮膚黑、武器長、性格直",
"tags": ["黑", "長", "直"]
}
3. 結果過濾:_source
- 現在,在所有的結果中,我只需要檢視
name
和age
兩個屬性,其他的不要怎麼辦?
GET test1/doc/_search
{
"query": {
"match": {
"name": "顧老二"
}
},
"_source": ["name", "age"]
}
- 如上例所示,在查詢中,透過
_source
來控制僅返回name
和age
屬性。
{
"took" : 8,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.8630463,
"hits" : [
{
"_index" : "test1",
"_type" : "doc",
"_id" : "1",
"_score" : 0.8630463,
"_source" : {
"name" : "顧老二",
"age" : 30
}
}
]
}
}
二、Elasticsearch之高亮查詢內容
1. 前言
- 如果返回的結果集中很多符合條件的結果,那怎麼能一眼就能看到我們想要的那個結果呢?比如下面網站所示的那樣,我們搜尋
elasticsearch
,在結果集中,將所有elasticsearch
高亮顯示?
[
- 如上圖我們搜尋百度一樣。我們該怎麼做呢?
2. 準備資料
PUT test1/doc/4
{
"name":"石頭",
"age":29,
"from":"gu",
"desc":"粗中有細,狐假虎威",
"tags":["粗", "大","猛"]
}
3. 預設高亮顯示
- 我們來查詢:
GET test1/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" : "test1",
"_type" : "doc",
"_id" : "4",
"_score" : 1.5098256,
"_source" : {
"name" : "石頭",
"age" : 29,
"from" : "gu",
"desc" : "粗中有細,狐假虎威",
"tags" : [
"粗",
"大",
"猛"
]
},
"highlight" : {
"name" : [
"<em>石</em><em>頭</em>"
]
}
}
]
}
}
- 上例中,
elasticsearch
會自動將檢索結果用標籤包裹起來,用於在頁面中渲染。
4. 自定義高亮顯示
- 但是,你可能會問,我不想用
em
標籤, 我這麼牛逼,應該用個b
標籤啊!好的,elasticsearch
同樣考慮到你很牛逼,所以,我們可以自定義標籤。
GET test1/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" : "test1",
"_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
語法的雙引號區分開