日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Elasticsearch之高亮查詢,聚合查詢,

 印度阿三17 2020-05-08

一 前言

如果返回的結(jié)果集中很多符合條件的結(jié)果,那怎么能一眼就能看到我們想要的那個(gè)結(jié)果呢?比如下面網(wǎng)站所示的那樣,我們搜索elasticsearch,在結(jié)果集中,將所有elasticsearch高亮顯示?

06119F24-7838-43D8-84EE-F20B929C16B7

如上圖我們搜索百度一樣。我們?cè)撛趺醋瞿兀?/p>

二 準(zhǔn)備數(shù)據(jù)

PUT lqz/doc/4
{
  "name":"石頭",
  "age":29,
  "from":"gu",
  "desc":"粗中有細(xì),狐假虎威",
  "tags":["粗", "大","猛"]
}

三 默認(rèn)高亮顯示

我們來查詢:

GET lqz/doc/_search
{
  "query": {
    "match": {
      "name": "石頭"
    }
  },
  "highlight": {
    "fields": {
      "name": {}
    }
  }
}

#我們使用highlight屬性來實(shí)現(xiàn)結(jié)果高亮顯示,需要的字段名稱添加到fields內(nèi)即可,elasticsearch會(huì)自動(dòng)幫我們實(shí)現(xiàn)高亮。
結(jié)果如下:

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 1.5098256,
    "hits" : [
      {
        "_index" : "lqz",
        "_type" : "doc",
        "_id" : "4",
        "_score" : 1.5098256,
        "_source" : {
          "name" : "石頭",
          "age" : 29,
          "from" : "gu",
          "desc" : "粗中有細(xì),狐假虎威",
          "tags" : [
            "粗",
            "大",
            "猛"
          ]
        },
        "highlight" : {
          "name" : [
            "<em>石</em><em>頭</em>"
          ]
        }
      }
    ]
  }
}
查詢結(jié)果

上例中,elasticsearch會(huì)自動(dòng)將檢索結(jié)果用標(biāo)簽包裹起來,用于在頁(yè)面中渲染。

四 自定義高亮顯示

GET lqz/chengyuan/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "highlight": {
    "pre_tags": "<b class='key' style='color:red'>",
    "post_tags": "</b>",
    "fields": {
      "from": {}
    }
  }
}
上例中,在highlight中,pre_tags用來實(shí)現(xiàn)我們的自定義標(biāo)簽的前半部分,在這里,我們也可以為自定義的標(biāo)簽添加屬性和樣式。post_tags實(shí)現(xiàn)標(biāo)簽的后半部分,組成一個(gè)完整的標(biāo)簽。至于標(biāo)簽中的內(nèi)容,則還是交給fields來完成。
{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 1,
    "max_score" : 0.5753642,
    "hits" : [
      {
        "_index" : "lqz",
        "_type" : "chengyuan",
        "_id" : "1",
        "_score" : 0.5753642,
        "_source" : {
          "name" : "老二",
          "age" : 30,
          "sex" : "male",
          "birth" : "1070-10-11",
          "from" : "gu",
          "desc" : "皮膚黑,武器長(zhǎng),性格直",
          "tags" : [
            "黑",
            "長(zhǎng)",
            "直"
          ]
        },
        "highlight" : {
          "name" : [
            "<b class='key' style='color:red'>老</b><b class='key' style='color:red'>二</b>"
          ]
        }
      }
    ]
  }
}
查詢結(jié)果

需要注意的是:自定義標(biāo)簽中屬性或樣式中的逗號(hào)一律用英文狀態(tài)的單引號(hào)表示,應(yīng)該與外部elasticsearch語(yǔ)法的雙引號(hào)區(qū)分開。

前后端分離,你怎么處理?把<b class='key' style='color:red'>串直接以json格式返回,前端自行渲染

Elasticsearch之聚合查詢

  • avg

  • max

  • min

  • sum

avg

# 查詢`from`是`gu`的人的平均年齡。
# select max(age) as my_avg from user;

GET lqz/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_avg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "_source": ["name", "age"]
}

上例中,首先匹配查詢fromgu的數(shù)據(jù)。在此基礎(chǔ)上做查詢平均值的操作,這里就用到了聚合函數(shù),其語(yǔ)法被封裝在aggs中,而my_avg則是為查詢結(jié)果起個(gè)別名,封裝了計(jì)算出的平均值。那么,要以什么屬性作為條件呢?是age年齡,查年齡的什么呢?是avg,查平均年齡。

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.6931472,
    "hits" : [
      {
        "_index" : "lqz",
        "_type" : "doc",
        "_id" : "4",
        "_score" : 0.6931472,
        "_source" : {
          "name" : "石頭",
          "age" : 29
        }
      },
      {
        "_index" : "lqz",
        "_type" : "doc",
        "_id" : "1",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "顧老二",
          "age" : 30
        }
      },
      {
        "_index" : "lqz",
        "_type" : "doc",
        "_id" : "3",
        "_score" : 0.2876821,
        "_source" : {
          "name" : "龍?zhí)灼?quot;,
          "age" : 22
        }
      }
    ]
  },
  "aggregations" : {
    "my_avg" : {
      "value" : 27.0
    }
  }
}
查詢結(jié)果

上例中,在查詢結(jié)果的最后是平均值信息,可以看到是27歲。

雖然我們已經(jīng)使用_source對(duì)字段做了過濾,但是還不夠。我不想看都有哪些數(shù)據(jù),只想看平均值怎么辦?別忘了size!

GET lqz/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_avg": {
      "avg": {
        "field": "age"
      }
    }
  },
  "size": 0, 
  "_source": ["name", "age"]
}

上例中,只需要在原來的查詢基礎(chǔ)上,增加一個(gè)size就可以了,輸出幾條結(jié)果,我們寫上0,就是輸出0條查詢結(jié)果。

{
  "took" : 8,
  "timed_out" : false,
  "_shards" : {
    "total" : 5,
    "successful" : 5,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : 3,
    "max_score" : 0.0,
    "hits" : [ ]
  },
  "aggregations" : {
    "my_avg" : {
      "value" : 27.0
    }
  }
}
查詢結(jié)果

max

GET lqz/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_max": {
      "max": {
        "field": "age"
      }
    }
  },
  "size": 0
}

上例中,只需要在查詢條件中將avg替換成max即可。

min

GET lqz/doc/_search
{
  "query": {
    "match": {
      "from": "gu"
    }
  },
  "aggs": {
    "my_min": {
      "min": {
        "field": "age"
      }
    }
  },
  "size": 0
}

sum

# 求年齡總和
GET lqz/doc/_search { "query": { "match": { "from": "gu" } }, "aggs": { "my_sum": { "sum": { "field": "age" } } }, "size": 0 }

分組查詢

現(xiàn)在我想要查詢所有人的年齡段,并且按照15~20,20~25,25~30分組,并且算出每組的平均年齡。

GET lqz/doc/_search
{
  "size": 0, 
  "query": {
    "match_all": {}
  },
  "aggs": {
    "age_group": {
      "range": {
        "field": "age",
        "ranges": [
          {
            "from": 15,
            "to": 20
          },
          {
            "from": 20,
            "to": 25
          },
          {
            "from": 25,
            "to": 30
          }
        ]
      },
      "aggs": {
        "my_avg": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
  }
}
{
 "took" : 1,
 "timed_out" : false,
 "_shards" : {
   "total" : 5,
   "successful" : 5,
   "skipped" : 0,
   "failed" : 0
 },
 "hits" : {
   "total" : 5,
   "max_score" : 0.0,
   "hits" : [ ]
 },
 "aggregations" : {
   "age_group" : {
     "buckets" : [
       {
         "key" : "15.0-20.0",
         "from" : 15.0,
         "to" : 20.0,
         "doc_count" : 1,
         "my_avg" : {
           "value" : 18.0
         }
       },
       {
         "key" : "20.0-25.0",
         "from" : 20.0,
         "to" : 25.0,
         "doc_count" : 1,
         "my_avg" : {
           "value" : 22.0
         }
       },
       {
         "key" : "25.0-30.0",
         "from" : 25.0,
         "to" : 30.0,
         "doc_count" : 2,
         "my_avg" : {
           "value" : 27.0
         }
       }
     ]
   }
 }
}
查詢結(jié)果

上例中,在aggs的自定義別名age_group中,使用range來做分組,field是以age為分組,分組使用ranges來做,fromto是范圍,我們根據(jù)需求做出三組。在分組下面,我們使用aggs對(duì)age做平均數(shù)處理,這樣就可以了。返回的結(jié)果中可以看到,已經(jīng)拿到了三個(gè)分組。doc_count為該組內(nèi)有幾條數(shù)據(jù),此次共分為三組,查詢出4條內(nèi)容。還有一條數(shù)據(jù)的age屬性值是30,不在分組的范圍內(nèi)!

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多