ElasticSearch入門 第七篇:分析器

来源:http://www.cnblogs.com/ljhdo/archive/2017/05/08/5012510.html
-Advertisement-
Play Games

在全文搜索(Fulltext Search)中,詞(Term)是一個搜索單元,表示文本中的一個詞,標記(Token)表示在文本欄位中出現的詞,由詞的文本、在原始文本中的開始和結束偏移量、以及數據類型等組成。ElasticSearch 把文檔數據寫到倒排索引(Inverted Index)的結構中,倒... ...


這是ElasticSearch 2.4 版本系列的第七篇:

 

在全文搜索(Fulltext Search)中,詞(Term)是一個搜索單元,表示文本中的一個詞,標記(Token)表示在文本欄位中出現的詞,由詞的文本、在原始文本中的開始和結束偏移量、以及數據類型等組成。ElasticSearch 把文檔數據寫到倒排索引(Inverted Index)的結構中,倒排索引建立詞(Term)和文檔之間的映射,索引中的數據是面向詞,而不是面向文檔的。分析器(Analyzer)的作用就是分析(Analyse),用於把傳入Lucene的文檔數據轉化為倒排索引,把文本處理成可被搜索的詞。分析器由一個分詞器(Tokenizer)和零個或多個標記過濾器(TokenFilter)組成,也可以包含零個或多個字元過濾器(Character Filter)。

在ElasticSearch引擎中,分析器的任務是分析(Analyze)文本數據,分析是分詞,規範化文本的意思,其工作流程是:

  • 首先,字元過濾器對分析(analyzed)文本進行過濾和處理,例如從原始文本中移除HTML標記,根據字元映射替換文本等,
  • 過濾之後的文本被分詞器接收,分詞器把文本分割成標記流,也就是一個接一個的標記,
  • 然後,標記過濾器對標記流進行過濾處理,例如,移除停用詞,把詞轉換成其詞乾形式,把詞轉換成其同義詞等,
  • 最終,過濾之後的標記流被存儲在倒排索引中;
  • ElasticSearch引擎在收到用戶的查詢請求時,會使用分析器對查詢條件進行分析,根據分析的結構,重新構造查詢,以搜索倒排索引,完成全文搜索請求,

可見,分析器扮演的是處理索引數據和查詢條件的重要角色。在2.4版本中,ElasticSearch 預定義了7個分析器,並且支持用戶根據預定義的字元過濾器,分詞器和標記過濾器創建自定義的分析器,以滿足用戶多樣性的文本分析需求。

用戶在創建索引時配置索引的分析,通過向ElasticSearch發送請求,在請求body的settings 配置節中設置索引的分析器,例如,為索引配置預設的分析器:

"settings":{  
    "index":{
        "analysis":{
            "analyzer":{
                "default":{
                    "type":"standard"
                    ,"stopwords":"_english_"
                }
            }
        }
    }
}

一,字元過濾器(Char Filter)

字元過濾器對未經分析的文本起作用,作用於被分析的文本欄位(該欄位的index屬性為analyzed),字元過濾器在分詞器之前工作,用於從文檔的原始文本去除HTML標記(markup),或者把字元“&”轉換為單詞“and”。ElasticSearch 2.4版本內置3個字元過濾器,分別是:映射字元過濾器(Mapping Char Filter)、HTML標記字元過濾器(HTML Strip Char Filter)和模式替換字元過濾器(Pattern Replace Char Filter)。

1,映射字元過濾器

映射字元過濾器,類型是mapping,需要建立一個查找字元和替換字元的映射(Mapping),過濾器根據映射把文本中的字元替換成指定的字元。

{
    "index" : {
        "analysis" : {
            "char_filter" : {
                "my_mapping" : {
                    "type" : "mapping",
                    "mappings" : [
                      "ph => f",
                      "qu => k"
                    ]
                }
            },
            "analyzer" : {
                "custom_with_char_filter" : {
                    "tokenizer" : "standard",
                    "char_filter" : ["my_mapping"]
                }
            }
        }
    }
}
View Code

2,HTML標記字元過濾器

HTML標記字元過濾器,類型是html_strip,用於從原始文本中去除HTML標記。

3,模式替換字元過濾器

模式替換字元過濾器,類型是pattern_replace,它使用正則表達式(Regular Expression)匹配字元,把匹配到的字元替換為指定的替換字元串。

PUT my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_analyzer": {
          "tokenizer": "standard",
          "char_filter": [
            "my_char_filter"
          ]
        }
      },
      "char_filter": {
        "my_char_filter": {
          "type": "pattern_replace",
          "pattern": "(\\d+)-(?=\\d)",
          "replacement": "$1_"
        }
      }
    }
  }
}
View Code

pattern參數:指定Java正則表達式;

replacement參數:指定替換字元串,把正則表達式匹配的字元串替換為replacement參數指定的字元串;

二,分詞器(Tokenizer)

分詞器在字元過濾器之後工作,用於把文本分割成多個標記(Token),一個標記基本上是詞加上一些額外信息,分詞器的處理結果是標記流,它是一個接一個的標記,準備被過濾器處理。ElasticSearch 2.4版本內置很多分詞器,本節簡單介紹常用的分詞器。

1,標準分詞器(Standard Tokenizer)

標準分詞器類型是standard,用於大多數歐洲語言,使用Unicode文本分割演算法對文檔進行分詞。

2,字母分詞器(Letter Tokenizer)

字元分詞器類型是letter,在非字母位置上分割文本,這就是說,根據相鄰的詞之間是否存在非字母(例如空格,逗號等)的字元,對文本進行分詞,對大多數歐洲語言非常有用。

3,空格分詞器(Whitespace Tokenizer)

空格分詞類型是whitespace,在空格處分割文本

4,小寫分詞器(Lowercase Tokenizer)

小寫分詞器類型是lowercase,在非字母位置上分割文本,並把分詞轉換為小寫形式,功能上是Letter Tokenizer和 Lower Case Token Filter的結合(Combination),但是性能更高,一次性完成兩個任務。

5,經典分詞器(Classic Tokenizer)

經典分詞器類型是classic,基於語法規則對文本進行分詞,對英語文檔分詞非常有用,在處理首字母縮寫,公司名稱,郵件地址和Internet主機名上效果非常好。

三,標記過濾器(Token Filter)

分析器包含零個或多個標記過濾器,標記過濾器在分詞器之後工作,用來處理標記流中的標記。標記過濾從分詞器中接收標記流,能夠刪除標記,轉換標記,或添加標記。ElasticSearch 2.4版本內置很多標記過濾器,本節簡單介紹常用的過濾器。

1,小寫標記過濾器(Lowercase)

類型是lowercase,用於把標記轉換為小寫形式,通過language參數指定語言,小寫標記過濾器支持的語言有:Greek, Irish, and Turkish

index :
    analysis :
        analyzer :
            myAnalyzer2 :
                type : custom
                tokenizer : myTokenizer1
                filter : [myTokenFilter1, myGreekLowerCaseFilter]
                char_filter : [my_html]
        tokenizer :
            myTokenizer1 :
                type : standard
                max_token_length : 900
        filter :
            myTokenFilter1 :
                type : stop
                stopwords : [stop1, stop2, stop3, stop4]
            myGreekLowerCaseFilter :
                type : lowercase
                language : greek
        char_filter :
              my_html :
                type : html_strip
                escaped_tags : [xxx, yyy]
                read_ahead : 1024
View Code

2,停用詞標記過濾器(Stopwords)

類型是stop,用於從標記流中移除停用詞。參數stopwords用於指定停用詞,ElasticSearch 2.4版本提供的預定義的停用詞列表:預定義的英語停用詞是_english_,使用預定義的英語停用詞列表是  “stopwords” :"_english_"

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "my_stop": {
                    "type":       "stop",
                    "stopwords": ["and", "is", "the"]
                }
            }
        }
    }
}

3,詞乾過濾器(Stemmer)

類型是stemmer,用於把詞轉換為其詞根形式存儲在倒排索引,能夠減少標記。

{
    "index" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["standard", "lowercase", "my_stemmer"]
                }
            },
            "filter" : {
                "my_stemmer" : {
                    "type" : "stemmer",
                    "name" : "english"
                }
            }
        }
    }
}
View Code

4,同義詞過濾器(Synonym)

類型是synonym,在分析階段,基於同義詞規則,把詞轉換為其同義詞存儲在倒排索引中

{
    "index" : {
        "analysis" : {
            "analyzer" : {
                "synonym" : {
                    "tokenizer" : "whitespace",
                    "filter" : ["synonym"]
                }
            },
            "filter" : {
                "synonym" : {
                    "type" : "synonym",
                    "synonyms_path" : "analysis/synonym.txt"
                }
            }
        }
    }
}
View Code

同義詞文件的格式示例:

# Blank lines and lines starting with pound are comments.

# Explicit mappings match any token sequence on the LHS of "=>"
# and replace with all alternatives on the RHS.  These types of mappings
# ignore the expand parameter in the schema.
# Examples:
i-pod, i pod => ipod,
sea biscuit, sea biscit => seabiscuit

# Equivalent synonyms may be separated with commas and give
# no explicit mapping.  In this case the mapping behavior will
# be taken from the expand parameter in the schema.  This allows
# the same synonym file to be used in different synonym handling strategies.
# Examples:
ipod, i-pod, i pod
foozball , foosball
universe , cosmos

# If expand==true, "ipod, i-pod, i pod" is equivalent
# to the explicit mapping:
ipod, i-pod, i pod => ipod, i-pod, i pod
# If expand==false, "ipod, i-pod, i pod" is equivalent
# to the explicit mapping:
ipod, i-pod, i pod => ipod

# Multiple synonym mapping entries are merged.
foo => foo bar
foo => baz
# is equivalent to
foo => foo bar, baz
View Code

四,系統預定義的分析器

在創建索引映射時引用分析器,如果沒有定義分析器,那麼ElasticSearch將使用預設的分析器,用戶可以通過API設置預設的分析器。

default 邏輯名稱用於配置在索引和搜索時使用的分析器,default_search 邏輯名稱用於配置在搜索時使用的分析器。

index :
  analysis :
    analyzer :
      default :
        tokenizer : keyword

1,標準分析器(Standard)

分析器類型是standard,由標準分詞器(Standard Tokenizer),標準標記過濾器(Standard Token Filter),小寫標記過濾器(Lower Case Token Filter)和停用詞標記過濾器(Stopwords Token Filter)組成。參數stopwords用於初始化停用詞列表,預設是空的。

2,簡單分析器(Simple)

分析器類型是simple,實際上是小寫標記分詞器(Lower Case Tokenizer),在非字母位置上分割文本,並把分詞轉換為小寫形式,功能上是Letter Tokenizer和 Lower Case Token Filter的結合(Combination),但是性能更高,一次性完成兩個任務。

3,空格分析器(Whitespace)

分析器類型是whitespace,實際上是空格分詞器(Whitespace Tokenizer)。

4,停用詞分析器(Stopwords)

分析器類型是stop,由小寫分詞器(Lower Case Tokenizer)和停用詞標記過濾器(Stop Token Filter)構成,配置參數stopwords 或 stopwords_path指定停用詞列表。

5,雪球分析器(Snowball)

分析器類型是snowball,由標準分詞器(Standard Tokenizer),標準過濾器(Standard Filter),小寫過濾器(Lowercase Filter),停用詞過濾器(Stop Filter)和雪球過濾器(Snowball Filter)構成。參數language用於指定語言。

{
    "index" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "type" : "snowball",
                    "language" : "English"
                }
            }
        }
    }
}
View Code

6,自定義分析器

分析器類型是custom,允許用戶定製分析器。參數tokenizer 用於指定分詞器,filter用於指定過濾器,char_filter用於指定字元過濾器。

index :
    analysis :
        analyzer :
            myAnalyzer2 :
                type : custom
                tokenizer : myTokenizer1
                filter : [myTokenFilter1, myTokenFilter2]
                char_filter : [my_html]
                position_increment_gap: 256
        tokenizer :
            myTokenizer1 :
                type : standard
                max_token_length : 900
        filter :
            myTokenFilter1 :
                type : stop
                stopwords : [stop1, stop2, stop3, stop4]
            myTokenFilter2 :
                type : length
                min : 0
                max : 2000
        char_filter :
              my_html :
                type : html_strip
                escaped_tags : [xxx, yyy]
                read_ahead : 1024
View Code

五,在創建索引時,指定預設的分析器

示例代碼,使用PUT動詞,在創建索引時指定預設的分析器,ElasticSearch引擎在索引文檔時,使用預設的分析器對index屬性為analyzed的文本欄位執行分析操作,而非分析欄位,將不會應用分析操作。

{  
   "settings":{  
      "number_of_shards":5,
      "number_of_replicas":0,
      "index":{
        "analysis":{
            "analyzer":{
                "default":{
                    "type":"standard"
                    ,"stopwords":"_english_"
                }
            }
        }
      }
   },
   "mappings":{  
      "events":{  
         "dynamic":"false",
         "properties":{  
            "eventid":{  
               "type":"long",
               "store":false,
               "index":"not_analyzed"
            },
            "eventname":{  
               "type":"string",
               "store":false,
               "index":"analyzed",
               "fields":{  
                  "raw":{  
                     "type":"string",
                     "store":false,
                     "index":"not_analyzed"
                  }
               }
            }
         }
      }
   }
}

 

 

參考文檔:

Elasticsearch: The Definitive Guide [2.x] » Dealing with Human Language

Elasticsearch Reference [2.4] » Analysis


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前些日子,Android原生開發將被取締的吵得火熱,JavaScript是能做一個完全的APP,但只使用JavaScript做出來的APP也不會牛逼到哪裡去。最好的是混合(Hybrid)開發,在需要的時候使用JavaScript,各有好處。 Hybrid App中原生頁面 VS H5頁面:http: ...
  • 1.登錄功能 用戶登陸使用手機號+簡訊驗證碼的方式登陸,伺服器端並不保存用戶手機號。 登陸成功後客戶端可以獲取到登陸標識,客戶端可以通過登陸標識保持相對長時間的訪問伺服器的許可權。 2.介面 獲得驗證碼: 匿名Login: 3.代碼 MainActivity LoginActivity ...
  • 一、佈局文件 設置界面,添加一個ImageView,和兩個Button按鈕,設置其屬性及id 二、聲明網路許可權 因為使用網路功能需要添加許可權,修改AndroidManifest.xml文件添加許可權聲明語句。 三、編輯ManActivity.java文件。 四、運行結果 點擊下載按鈕下載圖片。讀取圖片 ...
  • 問題描述:當我把已經做好的ArcGIS Android工程想在其他電腦運行時,總是會提示報錯。而報錯的地方,正是出現在下麵這條語句上。 解決方法:把這行註釋掉,重新Sync(同步)一下;再把註釋去掉,再Sync一下。你會發現工程可以運行了。 如果代碼編輯器右上角沒有找到 SyncNow 這個字眼,請 ...
  • 修改提示符,設置後挺方便的 例如: 幾個好用的參數 \d 當前資料庫 \u 當前用戶 \h 當前主機 更多參數可以參考mysol官方文檔 參考文檔:https://dev.mysql.com/doc/refman/5.7/en/mysql commands.html ...
  • 在使用Spark時經常需要把數據落入HBase中,如果使用普通的Java API,寫入會速度很慢。還好Spark提供了Bulk寫入方式的介面。那麼Bulk寫入與普通寫入相比有什麼優勢呢? BulkLoad不會寫WAL,也不會產生flush以及split。 如果我們大量調用PUT介面插入數據,可能會導 ...
  • 1.LIKE操作符 1.1百分號(%)通配符 SELECT prod_id, prod_name FROM Products WHERE prod_name LIKE 'Fish%' 此例子使用了搜索模式'Fish%'。在執行這條子句時,將檢索任意以Fish起頭的詞。%告訴DBMS接受Fish之後的 ...
  • 1.已設置兩種登錄模式. 2.SQL Server配置管理器已配置好. 按Windows徽標鍵+R組合鍵,然後輸入cmd. 再然後輸入netsh winsock reset.接下來重啟電腦,應該就可以連接了. 如果以上兩種未設置好,請先設置好. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...