ES中高級(jí)檢索(Query)

10.1 檢索方式 _search

ES官方提供了兩中檢索方式:一種是通過(guò) URL 參數(shù)進(jìn)行搜索,另一種是通過(guò) DSL(Domain Specified Language) 進(jìn)行搜索痢士。官方更推薦使用第二種方式第二種方式是基于傳遞JSON作為請(qǐng)求體(request body)格式與ES進(jìn)行交互衡楞,這種方式更強(qiáng)大逊脯,更簡(jiǎn)潔磷脯。

image-20200701225025975.png
  • 使用語(yǔ)法

    URL查詢: GET /索引/類型/_search?參數(shù)

    DSL查詢: GET /索引/類型/_search {}

10.2 測(cè)試數(shù)據(jù)

1.刪除索引
DELETE /ems

2.創(chuàng)建索引并指定類型
PUT /ems
{
  "mappings":{
    "emp":{
      "properties":{
        "name":{
          "type":"text"
        },
        "age":{
          "type":"integer"
        },
        "bir":{
          "type":"date"
        },
        "content":{
          "type":"text"
        },
        "address":{
          "type":"keyword"
        }
      }
    }
  }
}

3.插入測(cè)試數(shù)據(jù)
PUT /ems/emp/_bulk
  {"index":{}}
  {"name":"小黑","age":23,"bir":"2012-12-12","content":"為開(kāi)發(fā)團(tuán)隊(duì)選擇一款優(yōu)秀的MVC框架是件難事兒坎匿,在眾多可行的方案中決擇需要很高的經(jīng)驗(yàn)和水平","address":"北京"}
  {"index":{}}
  {"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一個(gè)分層架構(gòu),由 7 個(gè)定義良好的模塊組成浊吏。Spring 模塊構(gòu)建在核心容器之上爹脾,核心容器定義了創(chuàng)建、配置和管理 bean 的方式","address":"上海"}
  {"index":{}}
  {"name":"張小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作為Java 語(yǔ)言的微服務(wù)框架坡疼,它依賴于Spring Boot彬呻,有快速開(kāi)發(fā)、持續(xù)交付和容易部署等特點(diǎn)柄瑰。Spring Cloud 的組件非常多闸氮,涉及微服務(wù)的方方面面,井在開(kāi)源社區(qū)Spring 和Netflix 教沾、Pivotal 兩大公司的推動(dòng)下越來(lái)越完善","address":"無(wú)錫"}
  {"index":{}}
  {"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目標(biāo)是致力于全方位的簡(jiǎn)化Java開(kāi)發(fā)蒲跨。 這勢(shì)必引出更多的解釋, Spring是如何簡(jiǎn)化Java開(kāi)發(fā)的授翻?","address":"南京"}
  {"index":{}}
  {"name":"梅超風(fēng)","age":43,"bir":"2012-12-12","content":"Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫或悲、支持網(wǎng)絡(luò)孙咪、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù)巡语,并提供多種語(yǔ)言的API","address":"杭州"}
  {"index":{}}
  {"name":"張無(wú)忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一個(gè)基于Lucene的搜索服務(wù)器翎蹈。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于RESTful web接口","address":"北京"}

10.2 URL檢索

GET /ems/emp/_search?q=&sort=age:asc*

_search 搜索的API
      q=*     匹配所有文檔
      sort    以結(jié)果中的指定字段排序

GET /ems/emp/_search?q=*&sort=age:desc&size=5&from=0&_source=name,age,bir

10.3 DSL檢索

NOTE: 以下重點(diǎn)講解DSL語(yǔ)法

GET /ems/emp/_search
{
    "query": {"match_all": {}},
    "sort": [
        {
            "age": {
                "order": "desc"
            }
        }
    ]
}

10.4 DSL高級(jí)檢索(Query)

0. 查詢所有(match_all)

match_all關(guān)鍵字: 返回索引中的全部文檔

GET /ems/emp/_search
{
    "query": { "match_all": {} }
}   

1. 查詢結(jié)果中返回指定條數(shù)(size)

size 關(guān)鍵字: 指定查詢結(jié)果中返回指定條數(shù)捌臊。 默認(rèn)返回值10條

GET /ems/emp/_search
{
    "query": { "match_all": {} },
    "size": 1
}   

2. 分頁(yè)查詢(from)

from 關(guān)鍵字: 用來(lái)指定起始返回位置,和size關(guān)鍵字連用可實(shí)現(xiàn)分頁(yè)效果

GET /ems/emp/_search
{
      "query": {"match_all": {}},
      "sort": [
        {
          "age": {
            "order": "desc"
          }
        }
      ],
      "size": 2, 
      "from": 1
}

3. 查詢結(jié)果中返回指定字段(_source)

_source 關(guān)鍵字: 是一個(gè)數(shù)組,在數(shù)組中用來(lái)指定展示那些字段

GET /ems/emp/_search
{
      "query": { "match_all": {} },
      "_source": ["account_number", "balance"]
}

4. 關(guān)鍵詞查詢(term)

term 關(guān)鍵字: 用來(lái)使用關(guān)鍵詞查詢

GET /ems/emp/_search
{
  "query": {
    "term": {
      "address": {
        "value": "北京"
      }
    }
  }
}

NOTE1: 通過(guò)使用term查詢得知ES中默認(rèn)使用分詞器為標(biāo)準(zhǔn)分詞器(StandardAnalyzer),標(biāo)準(zhǔn)分詞器對(duì)于英文單詞分詞,對(duì)于中文單字分詞兜材。

NOTE2: 通過(guò)使用term查詢得知,在ES的Mapping Type 中 keyword , date ,integer, long , double , boolean or ip 這些類型不分詞理澎,只有text類型分詞

練習(xí):


PUT /ems
{
  "mappings":{
    "emp":{
      "properties":{
        "name":{
          "type":"text"
        },
        "age":{
          "type":"integer"
        },
        "bir":{
          "type":"date"
        },
        "content":{
          "type":"text"
        },
        "address":{
          "type":"keyword"
        }
      }
    }
  }
}

PUT /ems/emp/_bulk
  {"index":{}}
  {"name":"小黑","age":23,"bir":"2012-12-12","content":"為開(kāi)發(fā)團(tuán)隊(duì)選擇一款優(yōu)秀的MVC框架是件難事兒曙寡,在眾多可行的方案中決擇需要很高的經(jīng)驗(yàn)和水平","address":"北京"}
  {"index":{}}
  {"name":"王小黑","age":24,"bir":"2012-12-12","content":"Spring 框架是一個(gè)分層架構(gòu)糠爬,由 7 個(gè)定義良好的模塊組成。Spring 模塊構(gòu)建在核心容器之上举庶,核心容器定義了創(chuàng)建执隧、配置和管理 bean 的方式","address":"上海"}
  {"index":{}}
  {"name":"張小五","age":8,"bir":"2012-12-12","content":"Spring Cloud 作為Java 語(yǔ)言的微服務(wù)框架,它依賴于Spring Boot户侥,有快速開(kāi)發(fā)镀琉、持續(xù)交付和容易部署等特點(diǎn)。Spring Cloud 的組件非常多蕊唐,涉及微服務(wù)的方方面面屋摔,井在開(kāi)源社區(qū)Spring 和Netflix 、Pivotal 兩大公司的推動(dòng)下越來(lái)越完善","address":"無(wú)錫"}
  {"index":{}}
  {"name":"win7","age":9,"bir":"2012-12-12","content":"Spring的目標(biāo)是致力于全方位的簡(jiǎn)化Java開(kāi)發(fā)替梨。 這勢(shì)必引出更多的解釋钓试, Spring是如何簡(jiǎn)化Java開(kāi)發(fā)的?","address":"南京"}
  {"index":{}}
  {"name":"梅超風(fēng)","age":43,"bir":"2012-12-12","content":"Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫副瀑、支持網(wǎng)絡(luò)弓熏、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù)糠睡,并提供多種語(yǔ)言的API","address":"杭州"}
  {"index":{}}
  {"name":"張無(wú)忌","age":59,"bir":"2012-12-12","content":"ElasticSearch是一個(gè)基于Lucene的搜索服務(wù)器挽鞠。它提供了一個(gè)分布式多用戶能力的全文搜索引擎,基于RESTful web接口","address":"北京"}
  
  
  
ES中高級(jí)查詢 QueryString QueryDSL


一狈孔、QueryString方式查詢 查詢所有q=* 排序 sort 分頁(yè) from size
GET /ems/emp/_search?q=*&sort=age:desc&size=5&from=0&_source=name,age,bir


二滞谢、 QueryDSL 方式查詢 特定領(lǐng)域的查詢語(yǔ)言

1、查詢所有
GET /ems/emp/_search
{
  "query": {
    "match_all": {}
  }
}

2除抛、查詢所有并排序 sort
GET /ems/emp/_search
{
  "query": {
    "match_all": {}
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    },
    {
      "address":{
        "order":"desc"
      }
    }
  ]
}

3狮杨、分頁(yè)查詢 size from
GET /ems/emp/_search
{
  "query": {
    "match_all": {}
  },
  "size": "2",
  "from":"0",
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

4、指定查詢結(jié)果中返回指定字段 _source
GET /ems/emp/_search
{
  "query": {
    "match_all": {}
  },
  "_source": ["name","age","bir"]
}

5到忽、QueryDSL中term查詢橄教, 基于關(guān)鍵詞進(jìn)行查詢
GET /ems/emp/_search
{
  "query": {
    "term": {
      "content": {
        "value": "spring"
      }
    }
  }
}

1.type:  text 類型分詞 其他類型如keyword integer等不分詞
2.ES中默認(rèn)使用的分詞器是 標(biāo)準(zhǔn)分詞器
strandard 中文--->單字分詞 英文---->單詞分詞

GET /_analyze
{
  "text":"java 是一個(gè)好語(yǔ)言"
}

GET /_analyze
{
  "text":"nono is a good person"
}
3.ES中索引的庫(kù)的底層原理.jpg

索引區(qū):name:[張:0:1清寇,張:1:1]在0號(hào)文檔中,出現(xiàn)1次护蝶,在1號(hào)文檔中出現(xiàn)1次华烟。

5. 范圍查詢(range)

range 關(guān)鍵字: 用來(lái)指定查詢指定范圍內(nèi)的文檔

GET /ems/emp/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 8,
        "lte": 30
      }
    }
  }
}

6. 前綴查詢(prefix)

prefix 關(guān)鍵字: 用來(lái)檢索含有指定前綴的關(guān)鍵詞的相關(guān)文檔

GET /ems/emp/_search
{
  "query": {
    "prefix": {
      "content": {
        "value": "redis"
      }
    }
  }
}

7. 通配符查詢(wildcard)

wildcard 關(guān)鍵字: 通配符查詢 ? 用來(lái)匹配一個(gè)任意字符 * 用來(lái)匹配多個(gè)任意字符

GET /ems/emp/_search
{
  "query": {
    "wildcard": {
      "content": {
        "value": "re*"
      }
    }
  }
}

8. 多id查詢(ids)

ids 關(guān)鍵字 : 值為數(shù)組類型,用來(lái)根據(jù)一組id獲取多個(gè)對(duì)應(yīng)的文檔

GET  /ems/emp/_search
{
  "query": {
    "ids": {
      "values": ["lg5HwWkBxH7z6xax7W3_","lQ5HwWkBxH7z6xax7W3_"]
    }
  }
}

9. 模糊查詢(fuzzy)

fuzzy 關(guān)鍵字: 用來(lái)模糊查詢含有指定關(guān)鍵字的文檔

GET /ems/emp/_search
{
  "query": {
    "fuzzy": {
      "content":"spring"
    }
  }
}

fuzzy 模糊查詢  最大模糊錯(cuò)誤 必須在0-2之間
# 搜索關(guān)鍵詞長(zhǎng)度為 2 不允許存在模糊 0
# 搜索關(guān)鍵詞長(zhǎng)度為3-5 允許一次模糊 0 1 
# 搜索關(guān)鍵詞長(zhǎng)度大于5 允許最大2模糊

10. 布爾查詢(bool)

bool 關(guān)鍵字: 用來(lái)組合多個(gè)條件實(shí)現(xiàn)復(fù)雜查詢

must: 相當(dāng)于&& 同時(shí)成立

should: 相當(dāng)于|| 成立一個(gè)就行

must_not: 相當(dāng)于! 不能滿足任何一個(gè)

GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 0,
              "lte": 30
            }
          }
        }
      ],
      "must_not": [
        {"wildcard": {
          "content": {
            "value": "redi?"
          }
        }}
      ]
    }
  },
  "sort": [
    {
      "age": {
        "order": "desc"
      }
    }
  ]
}

11. 高亮查詢(highlight)

highlight 關(guān)鍵字: 可以讓符合條件的文檔中的關(guān)鍵詞高亮

GET /ems/emp/_search
{
  "query": {
    "term": {
      "content": {
        "value": "redis"
      }
    }
  },
  "highlight": {
    "fields": {
      "*": {}
    }
  }
}

自定義高亮html標(biāo)簽: 可以在highlight中使用pre_tagspost_tags

GET /ems/emp/_search
{
  "query":{
    "term":{
      "content":"框架"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red'>"],
    "post_tags": ["</span>"],
    "fields": {
      "*":{}
    }
  }
}

多字段高亮 使用require_field_match開(kāi)啟多個(gè)字段高亮

 GET /ems/emp/_search
{
  "query":{
    "term":{
      "content":"框架"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red'>"],
    "post_tags": ["</span>"],
    "require_field_match":false,
    "fields": {
      "*":{}
    }
  }
}

12. 多字段查詢(multi_match)

GET /ems/emp/_search
{
  "query": {
    "multi_match": {
      "query": "中國(guó)",
      "fields": ["name","content"] #這里寫要檢索的指定字段
    }
  }
}

13. 多字段分詞查詢(query_string)

GET /dangdang/book/_search
{
  "query": {
    "query_string": {
      "query": "中國(guó)聲音",
      "analyzer": "ik_max_word", 
      "fields": ["name","content"]
    }
  }
}

練習(xí):


6、范圍查詢 range  gte大于等于   gt大于  lte小于等于   lt小于
GET /ems/emp/_search
{
  "query": {
    "range": {
      "age": {
        "gte": 8,
        "lte": 9
      }
    }
  }
}


7持灰、前綴查詢 基于關(guān)鍵詞前綴查詢prefix
GET /ems/emp/_search
{
  "query": {
    "prefix": {
      "address": {
        "value": "北"
      }
    }
  }
}

8盔夜、通配符查詢 wildcard ?只匹配一個(gè)任意 *匹配0到任意多個(gè)
GET /ems/emp/_search
{
  "query": {
    "wildcard": {
      "address": {
        "value": "北*"
      }
    }
  }
}


9堤魁、多個(gè)id查詢 ids 查詢
GET /ems/emp/_search
{
  "query": {
    "ids": {
      "values": ["XUhDGHcBbQMu0BWMWNNT","YkhDGHcBbQMu0BWMWNNT"]
    }
  }
}

10喂链、模糊查詢 fuzzy  最大模糊錯(cuò)誤在0-2之間
搜索關(guān)鍵字長(zhǎng)度為2 不允許存在模糊 0
搜索關(guān)鍵字長(zhǎng)度為3-5 允許一次模糊 0-1
搜索關(guān)鍵字長(zhǎng)度大于5  允許最大2次模糊
GET /ems/emp/_search
{
  "query": {
    "fuzzy": {
      "content":"sproog"
    }
  }
}



11、布爾查詢 bool  must(兩者條件必須滿足)  shoud(滿足其中一個(gè)條件)  must_not(兩個(gè)條件都不滿足的)
GET /ems/emp/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "age": {
              "value": "23"
            }
          }
        },
        {
            "range": {
            "FIELD": {
              "gte": 0,
             "lte": 30
            }
          }
        }
      ]
    }
  }
}


12妥泉、高亮查詢 highlight 查詢結(jié)果做二次渲染 高亮
 GET /ems/emp/_search
{
  "query":{
    "term":{
      "content":"redis"
    }
  },
  "highlight": {
    "pre_tags": ["<span style='color:red'>"],
    "post_tags": ["</span>"],
    "require_field_match":false,
    "fields": {
      "*":{}
    }
  }
}

13椭微、多字段查詢 multi_match搜索比較智能
1、如果搜索的字段分詞 它會(huì)對(duì)query先進(jìn)行分詞 再搜索
2盲链、如果搜索的字段比分詞蝇率,它會(huì)使用query整體進(jìn)行該字段搜索

GET /ems/emp/_search
{
  "query": {
    "multi_match": {
      "query": "中國(guó)",
      "fields": ["name","content"] 
    }
  }
}


14、多字段分詞查詢 query_string
GET /ems/emp/_search
{
  "query": {
    "query_string": {
      "query": "小redis",
      "fields": ["name","content"],
      "analyzer": "ik_max_word"
    }
  }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刽沾,一起剝皮案震驚了整個(gè)濱河市本慕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌侧漓,老刑警劉巖间狂,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異火架,居然都是意外死亡鉴象,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門何鸡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纺弊,“玉大人,你說(shuō)我怎么就攤上這事骡男∠危” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵隔盛,是天一觀的道長(zhǎng)犹菱。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吮炕,這世上最難降的妖魔是什么腊脱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮龙亲,結(jié)果婚禮上陕凹,老公的妹妹穿的比我還像新娘悍抑。我一直安慰自己,他們只是感情好杜耙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布搜骡。 她就那樣靜靜地躺著,像睡著了一般佑女。 火紅的嫁衣襯著肌膚如雪记靡。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,394評(píng)論 1 310
  • 那天团驱,我揣著相機(jī)與錄音摸吠,去河邊找鬼。 笑死店茶,一個(gè)胖子當(dāng)著我的面吹牛蜕便,可吹牛的內(nèi)容都是我干的劫恒。 我是一名探鬼主播贩幻,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼两嘴!你這毒婦竟也來(lái)了丛楚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤憔辫,失蹤者是張志新(化名)和其女友劉穎趣些,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贰您,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坏平,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锦亦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舶替。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖杠园,靈堂內(nèi)的尸體忽然破棺而出顾瞪,到底是詐尸還是另有隱情,我是刑警寧澤抛蚁,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布陈醒,位于F島的核電站,受9級(jí)特大地震影響瞧甩,放射性物質(zhì)發(fā)生泄漏钉跷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一肚逸、第九天 我趴在偏房一處隱蔽的房頂上張望尘应。 院中可真熱鬧惶凝,春花似錦、人聲如沸犬钢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)玷犹。三九已至混滔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間歹颓,已是汗流浹背坯屿。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巍扛,地道東北人领跛。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像撤奸,于是被迫代替她去往敵國(guó)和親吠昭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容