[勾勒一個自己的搜索引擎]ES2輕量級搜索

概述

ES是一個搜索引擎曹货,我們之所以要使用它就是為了借助它快速構(gòu)建全文索引,幫助我們快速檢索數(shù)據(jù)检访。

本文接著上篇文章ElasticSearch1初步使用繼續(xù)來通過blogs索引實例說明如何簡單的借助ES實現(xiàn)輕量級搜索功能眶拉。

問題

本文主要以應(yīng)用ES為基本問題,主要探索ES通過GET方法進行搜索的使用方法济欢。在實驗的示例中本文也會簡要的描述ES相關(guān)的理論知識赠堵。

如何使用索引進行搜索,對搜索結(jié)果進行分頁法褥,并使用簡單的條件來過濾搜過結(jié)果是本文需要探討的問題茫叭。

方法

本文采用對照RDBMS中SELECT功能的方法來描述ES中的輕量級搜索的概念,從總體上來講半等,在ES中搜索數(shù)據(jù)其實和在RDBMS中SELECT數(shù)據(jù)是一樣的揍愁,都可以指定搜索(查詢)條件,都可以設(shè)置返回字段酱鸭,也都可以進行一定的聚合運算吗垮。只不過ES搜索引擎使用全文搜索得到的結(jié)果會根據(jù)內(nèi)容與搜索關(guān)鍵字的匹配程度給與每個結(jié)果一個權(quán)重,這個權(quán)重就作為搜索結(jié)果排序的依據(jù)凹髓。而RDBMS完全是依照ORDER BY子句中指定的排序規(guī)則進行排序的烁登。

說明:

ES REST API所提供的完全在URL中描述參數(shù)的接口就是輕量級搜索接口,換句話說輕量級搜索接口都是使用GET方法的。所以文中示例使用的地址和API語法總結(jié)如沒有對HTTP請求方法做出特殊聲明饵沧,均使用GET方法锨络。

對本文中語法說明特殊字符的聲明:

  • {a} 代表a變量,如{host}代表主機名或ip地址,{index}代表索引名
  • [] 代表可出現(xiàn)也可不出現(xiàn)狼牺,一般情況下帶有[]標識的變量出現(xiàn)和不出現(xiàn)會有不同的含義羡儿。對于URL開頭的[http[s]://]表達式,如果省略整個表達式則系統(tǒng)會默認使用http協(xié)議是钥。
  • ... 對返回結(jié)果或請求內(nèi)容進行部分省略掠归。

全量數(shù)據(jù)搜索

語法

請求信息:

[http[s]://]{host}:{port}/[{index}/[{type}/]]_search

響應(yīng)信息:

{
    "took": 7,//執(zhí)行搜索請求的耗時,單位毫秒
    "timed_out": false,//搜索是否超時
    "_shards":{//參與本次搜索的分片信息
        "total": 5,//參與本次搜索的分票總個數(shù)
        "successful": 5,//有多少個分片成功的完成了搜索任務(wù)
        "failed": 0 //有多少分片執(zhí)行搜索任務(wù)失敗
    },
    "hits":{ //搜過結(jié)果信息
        "total": 1,//匹配到的文檔總數(shù)
        "max_score": 1.0193838,//查詢所匹配文檔的 _score 的最大值悄泥。
        "hits":[...]//匹配到的文檔詳細信息結(jié)果集
    }
}

在沒有指定分頁條件的情況下虏冻,響應(yīng)信息默認返回10條結(jié)果。

示例

搜索blogs索引下弹囚,articles類型下的全部文檔厨相。這是一個沒有任何過濾條件的最簡單的搜索。

請求信息:

http://ubuntu:9200/blogs/articles/_search

響應(yīng)信息:

{
  ...,
    "hits" : [
      {
        "_index" : "blogs",
        "_type" : "articles",
        "_id" : "AV6GlxJvP5Roqj_P-AOw",
        "_score" : 1.0,
        "_source" : {
          "title" : "ES自動生成id索引",
          "author" : "為為",
          "since" : "2017-09-16 20:20:20",
          "categorie" : "搜索引擎",
          "tags" : [
            "java",
            "研發(fā)"
          ],
          "body" : "如果你無法手動對文檔進行編號鸥鹉,可以使用POST方法向ES中索引一個新文檔蛮穿,其操作方法和鏈接規(guī)則如圖8所示。"
        }
      },
      ...//更多內(nèi)容暫時省略
    ]
  }
}

簡單條件篩選

簡單的條件篩選就像是給SQL中的SELECT語句加上WHERE子句毁渗,從而限定只查找滿足某些條件的結(jié)果践磅。

語法

在請求路徑中使用q參數(shù),并將查詢條件賦值給q

[http[s]://]{host}:{port}/[{index}/[{type}/]]_search?q={param_name}:{param_value}
示例

我們搜索一下文章的tags包含 標簽1 的文章祝蝠。

請求參數(shù):

http://ubuntu:9200/blogs/articles/_search?q=tags:標簽1

響應(yīng)參數(shù):

{
  ...,
  "hits" : {
    ...
    "hits" : [
      {
        "_index" : "blogs",
        "_type" : "articles",
        "_id" : "1",
        "_score" : 1.0193838,
        "_source" : {
          "title" : "第一篇文章",
          "author" : "馬華",
          "since" : "2017-09-10 20:20:20",
          "categorie" : "科學(xué)讀物",
          "tags" : [
            "標簽1",
            "標簽2"
          ],
          "body" : "測試文章內(nèi)容"
        }
      }
    ]
  }
}

分頁

我們在SQL中SELECT語句可以使用LIMIT關(guān)鍵字進行分頁音诈,來保證我們每次查詢只拿符合需求的數(shù)據(jù)條數(shù)。剛剛也提到過ES也支持分頁绎狭,默認每頁有10條數(shù)據(jù)细溅。

語法

在搜索URL中可以使用size參數(shù)指定頁大小,from應(yīng)跳過的結(jié)果集條數(shù)儡嘶。

請求信息:

[http[s]://]{host}:{port}/[{index}/[{type}/]]_search[?[size={size}][[&]from={from}]]
示例

不使用任何過濾條件搜索blogs索引type類型下的所有文檔喇聊,指定頁大小為2,從第跳過1條結(jié)果蹦狂。

請求信息:

http://ubuntu:9200/blogs/articles/_search?size=2&from=1

響應(yīng)信息請自行演示誓篱。

多索引和類型

如果你需要在一個或多個特殊的索引并且在一個或者多個特殊的類型中進行搜索。我們可以通過在URL中指定特殊的索引和類型達到這種效果凯楔,下面舉例說明如何使用多索引或多類型窜骄。
在所有的索引中搜索所有的類型

http://ubuntu:9200/_search

在 blogs 索引中搜索所有的類型

http://ubuntu:9200/blogs/_search

在 blogs 和 pictures 索引中搜索所有的文檔

http://ubuntu:9200/blogs,pictures/_search

在任何以 b 或者 p 開頭的索引中搜索所有的類型

http://ubuntu:9200/b*,g*/_search

在 blogs 索引中搜索 aiticles 類型

http://ubuntu:9200/blogs/articles/_search

在 blogs 和 pictures 索引中搜索 articles 和 a_images 類型的文檔

http://ubuntu:9200/blogs,pictures/articles,a_images/_search

在所有的索引中搜索 articles 和 a_images 類型的文檔

http://ubuntu:9200/_all/articles,a_images/_search

當在單一的索引下進行搜索的時候,Elasticsearch 轉(zhuǎn)發(fā)請求到索引的每個分片中摆屯,可以是主分片也可以是副本分片邻遏,然后從每個分片中收集結(jié)果。多索引搜索恰好也是用相同的方式工作的,只是會涉及到更多的分片准验。

多個搜索條件

剛剛介紹的條件搜索只能使用一個搜索條件赎线,而我們一般的業(yè)務(wù)都需要更為復(fù)雜的搜索條件。

_all字段

在 blogs/aiticles 中搜索“為為”的相關(guān)信息糊饱,注意該搜索中并未指定“為為”屬于哪個字段垂寥。

http://ubuntu:9200/blogs/_search?q=為為
同時搜索多個字段

在 blogs/aiticles中搜索author包含"為為", title包含"ES"的信息另锋。

http://ubuntu:9200/blogs/articles/_search?q=+title:ES自動生成id索引 +author:為為 
  • 前綴表示必須與查詢條件匹配滞项。類似地, -前綴表示一定不與查詢條件匹配夭坪。沒有 + 或者 -的所有其他條件都是可選的——匹配的越多蓖扑,文檔就越相關(guān)。在存在多個條件時台舱,如果沒有明確使用default_operator=AND指定多個條件的關(guān)系為AND,則多個條件的關(guān)系為OR潭流。
同一個字段下多種可能性

在 blogs/aiticles中搜索author包含"為為"竞惋,tags為"java"或"編碼"的信息。

http://ubuntu:9200/blogs/articles/_search?q=+tags:(java 研發(fā))  +author:為為

在 blogs/aiticles中搜索author包含"為為"灰嫉,tags為"java"或"編碼"的信息拆宛。

http://ubuntu:9200/blogs/articles/_search?q=+tags:(java 研發(fā))  +author:為為&default_operator=AND

總結(jié)

經(jīng)過本文示例我們可以看出ES不僅可以作為一個NoSQL數(shù)據(jù)庫,存儲格式化的JSON數(shù)據(jù)讼撒,其更強大的功能在于搜索浑厚。ES不僅會存儲文檔,文檔中的每個字段都將被索引并且可以被查詢 根盒。不僅如此钳幅,在簡單查詢時,Elasticsearch 可以使用 所有(all)索引字段炎滞,快度返回結(jié)果敢艰,我們甚至不必指定具體要搜索哪個字段就。

總之ES的搜索可以完成以下任務(wù):

  • 在結(jié)構(gòu)化的數(shù)據(jù)(JSON)中使用結(jié)構(gòu)化查詢册赛。
  • 全文檢索钠导。

輕量級搜索雖然簡單方便,但其也有缺點:

  • 當查詢字符串中很小的語法錯誤森瘪,像 - 牡属, : , / 或者 " 不匹配等扼睬,將會返回錯誤而不是搜索結(jié)果逮栅。
  • 允許任何用戶在索引的任意字段上執(zhí)行可能較慢且重量級的查詢,這可能會暴露隱私信息,甚至將集群拖垮证芭。

基于以上兩點原因瞳浦,不推薦向用戶直接開放輕量級搜索功能,一般情況下只在開發(fā)調(diào)試中使用废士。

引用

本文是我在學(xué)習(xí)使用ES時的筆記叫潦,在本文的寫過過程中參考了大量其它資料,有些材料來源于網(wǎng)絡(luò)官硝,我由衷的表示感謝矗蕊,但由于原作者不明,恕不能一一記述氢架。

  1. Elasticsearch 權(quán)威指南.——https://www.elastic.co/
  2. Elasticsearch技術(shù)解析與實戰(zhàn)/朱林編著.——北京:機械工業(yè)出版社傻咖,2016.12(數(shù)據(jù)分析與決策技術(shù)叢書)

關(guān)于

本項目和文檔中所用的內(nèi)容僅供學(xué)習(xí)和研究之用,轉(zhuǎn)載或引用時請指明出處岖研。如果你對文檔有疑問或問題卿操,請在項目中給我留言或發(fā)email到
weiwei02@vip.qq.com 我的github:
https://github.com/weiwei02/ 我相信技術(shù)能夠改變世界 。

鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末孙援,一起剝皮案震驚了整個濱河市害淤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拓售,老刑警劉巖窥摄,帶你破解...
    沈念sama閱讀 222,378評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異础淤,居然都是意外死亡崭放,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評論 3 399
  • 文/潘曉璐 我一進店門鸽凶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來币砂,“玉大人,你說我怎么就攤上這事吱瘩〉牢埃” “怎么了?”我有些...
    開封第一講書人閱讀 168,983評論 0 362
  • 文/不壞的土叔 我叫張陵使碾,是天一觀的道長蜜徽。 經(jīng)常有香客問我,道長票摇,這世上最難降的妖魔是什么拘鞋? 我笑而不...
    開封第一講書人閱讀 59,938評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮矢门,結(jié)果婚禮上盆色,老公的妹妹穿的比我還像新娘灰蛙。我一直安慰自己,他們只是感情好隔躲,可當我...
    茶點故事閱讀 68,955評論 6 398
  • 文/花漫 我一把揭開白布摩梧。 她就那樣靜靜地躺著,像睡著了一般宣旱。 火紅的嫁衣襯著肌膚如雪仅父。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,549評論 1 312
  • 那天浑吟,我揣著相機與錄音笙纤,去河邊找鬼。 笑死组力,一個胖子當著我的面吹牛省容,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燎字,決...
    沈念sama閱讀 41,063評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼腥椒,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了候衍?” 一聲冷哼從身側(cè)響起寞酿,我...
    開封第一講書人閱讀 39,991評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脱柱,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拉馋,經(jīng)...
    沈念sama閱讀 46,522評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡榨为,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,604評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了煌茴。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随闺。...
    茶點故事閱讀 40,742評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖蔓腐,靈堂內(nèi)的尸體忽然破棺而出矩乐,到底是詐尸還是另有隱情,我是刑警寧澤回论,帶...
    沈念sama閱讀 36,413評論 5 351
  • 正文 年R本政府宣布散罕,位于F島的核電站,受9級特大地震影響傀蓉,放射性物質(zhì)發(fā)生泄漏欧漱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,094評論 3 335
  • 文/蒙蒙 一葬燎、第九天 我趴在偏房一處隱蔽的房頂上張望误甚。 院中可真熱鬧缚甩,春花似錦、人聲如沸窑邦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,572評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冈钦。三九已至郊丛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間派继,已是汗流浹背宾袜。 一陣腳步聲響...
    開封第一講書人閱讀 33,671評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驾窟,地道東北人庆猫。 一個月前我還...
    沈念sama閱讀 49,159評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像绅络,于是被迫代替她去往敵國和親月培。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,747評論 2 361

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