ES查詢之查詢屬性過濾、結果高亮顯示

BigSun丶發表於2024-04-09

目錄
  • 一、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

  • 現在,在所有的結果中,我只需要檢視nameage兩個屬性,其他的不要怎麼辦?
GET test1/doc/_search
{
  "query": {
    "match": {
      "name": "顧老二"
    }
  },
  "_source": ["name", "age"]
}
  • 如上例所示,在查詢中,透過_source來控制僅返回nameage屬性。
{
  "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語法的雙引號區分開

相關文章