Elastic Stack-Elasticsearch使用介紹(一)

1、前言html

    Elasticsearch對外提供RESTful API,下面的演示咱們主要使用Postman,進行一系列的Demo演示,這款工具方便各位前端大大或者對接口調試的神器;前端

    安裝過於簡單我不作過多介紹,推薦一些文章供你們參考安裝:python

    windows:git

    windows單機版內含head插件github

    windows集羣版正則表達式

    Linux:數據庫

    Linux單機版內含head插件json

    Linux集羣版windows

    另外再推薦你們閱讀這篇文章:搜索引擎選擇: Elasticsearch與Solr數組

2、簡單的一些操做

#建立索引
PUT /test
#刪除索引
DELETE /test
#根據id建立文檔
#索引/type/id
PUT /test/doc/1
#建立文檔
#不帶id會自動生成id
#索引/type/
PUT /test/doc/
#查詢文檔
#使用id查詢文檔
GET /test/doc/1
#使用另外的DSL查詢方式等等下次介紹,經過JSON請求完成
View Code

    

   _bulk批量操做:

   

{"index":{"_index":"test","_type":"aaa","_id":"2"}}
{"userName":"123456"}
{"index":{"_index":"test","_type":"aaa","_id":"3"}}
{"userName":"1234567"}
{"delete":{"_index":"test","_type":"aaa","_id":"1"}}
View Code

   _mget批量查詢:

 

http://localhost:9200/test/_mget
{
    "docs":[
        {
             "_type":"aaa",
            "_id":"2"
        },
        {
            "_type":"bbbbb",
            "_id":"1"
        }
    ]
}
View Code

  若是type相同的話,可使用ids,將id放入數組當中;

  批量操做這2個API仍是很重要的,若是要一次性操做不少的數據必定要批量操做,儘量減小網絡開銷次數,提高系統的性能;

3、倒排索引

  以前我寫過一篇文章由樹到數據庫索引,你們能夠看下數據庫的正排索引,這裏咱們在舉一個例子,你們都知道書是有目錄頁和頁碼頁的,其實書的目錄頁就是正排索引,頁碼頁就是倒排索引;

  正排索引就是文檔Id到文檔的內容、單詞的關聯關係,以下圖

 

  倒排索引就是單詞到文檔id的關係,以下圖

 

  這個時候當咱們使用搜索引擎查詢包含Elasticsearch文檔的,這個時候流程多是這樣的

  1.經過倒排索引獲取包含Elasticsearch文檔id爲1;

  2.經過正排索引查找id爲1的文檔內容;

  3.拿到正確結果返回;

  這個時候咱們能夠來思考下倒排索引的結構了,當分詞之後以咱們瞭解到的數據結構來看的話B+樹是一種高效的查詢方式,整好符合分詞之後的結構,以下圖;

    

  當咱們快速拿到咱們想要的查詢的分詞的時候,咱們這個時候就須要知道最重要的東西就是文檔的id,這樣確實能夠拿到正確的結果,以下圖

 

 可是這個時候咱們再考慮下另外的狀況,當咱們在淘寶搜索一個物品的時候他有一個高亮顯示,這個時候咱們上面的狀況就知足不了咱們了,咱們就須要在倒排索引列表中加入分詞位置信息和偏移長度,這個時候咱們就能夠作高亮顯示;

 後面又來一種狀況,隨着文檔的擴大,咱們當用搜索引擎去查詢的時候會有不少結果,咱們須要優先顯示相近的,這個時候有須要另一個字段就是詞頻,記錄在文檔中出現的次數,這個時候就知足可能出現的全部狀況了,結構入下圖

 

 明白總體的結構,你就知道爲何搜索引擎能夠快速查詢出咱們要想要的結果來了,是否是很知足,那就點個關注吧!!哈哈!!固然內部有不少不少優化這個咱們暫時就先不要管了!!

4、分詞器

 分詞器組成

 分詞:按照某種規則將總體變成部分,在Elasticsearch中分詞的組件是分詞器(Analyzer),組成以下:

 1.Character Filters: 針對原始文本進行處理,有點相似正則過濾的意思;

 2.Tokenizer:按照指定規則進行分詞;

 3.Token Filters:將分好的詞再次粉裝轉化;

 分詞器API

 Elasticsearch給咱們提供分詞API就是_analyze,做用就是爲了測試是否能按照咱們想要的結果進行分詞,簡單的演示下怎麼使用:

 

 看一下返回結果,每一個token裏面都包含咱們說的倒排索引內全部字段,這個type含義我不是很清楚,可是無傷大雅,另外還能夠指定索引進行分詞,默認爲standard分詞器:

 

分詞器類型

1.standard

默認分詞器,按詞切分,支持多語言,字母轉化爲小寫,分詞效果太多JSON返回的過長不方便截圖,整體來講對中文支持不是很好,分紅一個字一個字,畢竟老外寫的;

2.simple

按照非字母切分,字母轉化爲小寫;

3.whitespace

按照空格切分;

4.stop

與simple相比增長了語氣助詞區分,例如then、an、的、得等;

5.keyword

不分詞;

6.pattern

經過正則表達式自定義分割符,默認\W+,非茲磁的符號做爲分隔符;

7.language

語言分詞器,內置多種語言;

以上都是自帶分詞器,對中文的支持都不是很好,接下來咱們看下有哪些中文分詞器:

1.IK

用法參考下Github,實現中英文分詞,支持ik_smart,ik_max_word等,支持自定義詞庫、更新分詞詞庫;

#url
http://localhost:9200/_analyze
#json體
{
    "analyzer":"ik_max_word",
    "text":"今天是個好天氣,我是中國人"
}
#ik_max_word分詞結果
{
    "tokens": [
        {
            "token": "今天是",
            "start_offset": 0,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "今天",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 1
        },
        {
            "token": "是",
            "start_offset": 2,
            "end_offset": 3,
            "type": "CN_CHAR",
            "position": 2
        },
        {
            "token": "個",
            "start_offset": 3,
            "end_offset": 4,
            "type": "CN_CHAR",
            "position": 3
        },
        {
            "token": "好天氣",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "好天",
            "start_offset": 4,
            "end_offset": 6,
            "type": "CN_WORD",
            "position": 5
        },
        {
            "token": "天氣",
            "start_offset": 5,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 6
        },
        {
            "token": "我",
            "start_offset": 8,
            "end_offset": 9,
            "type": "CN_CHAR",
            "position": 7
        },
        {
            "token": "是",
            "start_offset": 9,
            "end_offset": 10,
            "type": "CN_CHAR",
            "position": 8
        },
        {
            "token": "中國人",
            "start_offset": 10,
            "end_offset": 13,
            "type": "CN_WORD",
            "position": 9
        },
        {
            "token": "中國",
            "start_offset": 10,
            "end_offset": 12,
            "type": "CN_WORD",
            "position": 10
        },
        {
            "token": "國人",
            "start_offset": 11,
            "end_offset": 13,
            "type": "CN_WORD",
            "position": 11
        }
    ]
}
#ik_smart分詞結果
{
    "tokens": [
        {
            "token": "今天是",
            "start_offset": 0,
            "end_offset": 3,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "個",
            "start_offset": 3,
            "end_offset": 4,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "好天氣",
            "start_offset": 4,
            "end_offset": 7,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "我",
            "start_offset": 8,
            "end_offset": 9,
            "type": "CN_CHAR",
            "position": 3
        },
        {
            "token": "是",
            "start_offset": 9,
            "end_offset": 10,
            "type": "CN_CHAR",
            "position": 4
        },
        {
            "token": "中國人",
            "start_offset": 10,
            "end_offset": 13,
            "type": "CN_WORD",
            "position": 5
        }
    ]
}
View Code

 2.jieba

python中流行的分詞系統,玩Py的朋友看下GitHub;

以上基本知足咱們平常開發了,有興趣的能夠查看下HanLPTHULAC等等;

自定義分詞器

若是以上這些還知足不了你的需求,那麼你能夠進行自定義分詞,自定義的分詞的流程就是上面咱們介紹分詞器的組成的流程;

1.Character Filters

在tokenizer以前對原始文本進行處理 ,會影響在Tokenizer解析position和offset的信息,在這個裏面咱們能夠作以下事情:

html_strip 取出html標籤中的內容;

mapping進行字符串替換;

pattern_replace進行正則替換;

寫了一個簡單的demo,剩下你們能夠參考下官方文檔

2.Tokenizer

Tokenizer將原始文本按照必定規則切分爲單詞,大概分紅3類:

按照字符爲導向分割(Word Oriented Tokenizers):Standard Tokenizer、Letter Tokenizer、Whitespace Tokenizer等等;

部分單詞匹配(Partial Word Tokenizers):相似於ik_max_word;

按照某種結構進行分割(Structured Text Tokenizers):Path Tokenizer、Keyword Tokenizer等等;

詳細介紹查看官方文檔;

3.Token Filter

tokenizer輸出的單詞進行增長、刪除、修改等操做,tokenizer filter是能夠有多個的,自帶類型有好多你們能夠查看官方文檔

#url
http://localhost:9200/_analyze
#post請求體
{
    "tokenizer":"standard",
    "text": "I'm LuFei wo will haizheiwang ",
    "filter":[
        "stop",
        "lowercase",
        {
            "type":"ngram",
            "min_gram":5,
            "max_gram":8
        }
    ]
}
#返回分詞結果
{
    "tokens": [
        {
            "token": "lufei",
            "start_offset": 4,
            "end_offset": 9,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "haizh",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "haizhe",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "haizhei",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "haizheiw",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "aizhe",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "aizhei",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "aizheiw",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "aizheiwa",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "izhei",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "izheiw",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "izheiwa",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "izheiwan",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "zheiw",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "zheiwa",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "zheiwan",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "zheiwang",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "heiwa",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "heiwan",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "heiwang",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "eiwan",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "eiwang",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        },
        {
            "token": "iwang",
            "start_offset": 18,
            "end_offset": 29,
            "type": "<ALPHANUM>",
            "position": 4
        }
    ]
}
View Code

4.在索引中自定義分詞器

5、結束

下一篇介紹Mapping、Search Api,歡迎你們點贊,歡迎你們加羣438836709,歡迎你們關注公衆號

相關文章
相關標籤/搜索