ElasticSearch自定義分析器-集成結巴分詞插件

来源:http://www.cnblogs.com/dengzhizhong/archive/2017/02/07/6373333.html
-Advertisement-
Play Games

使用Elastic Search分析器,集成結巴分詞插件,並同時支持同義詞、字元映射等功能。 ...


關於結巴分詞 ElasticSearch 插件:

https://github.com/huaban/elasticsearch-analysis-jieba

該插件由huaban開發。支持Elastic Search 版本<=2.3.5。

結巴分詞分析器

結巴分詞插件提供3個分析器:jieba_index、jieba_search和jieba_other。

  1. jieba_index: 用於索引分詞,分詞粒度較細;
  2. jieba_search: 用於查詢分詞,分詞粒度較粗;
  3. jieba_other: 全形轉半形、大寫轉小寫、字元分詞;

使用jieba_index或jieba_search分析器,可以實現基本的分詞效果。

以下是最小配置示例:

{
    "mappings": {
        "test": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "name": {
                    "type": "string",
                    "analyzer": "jieba_index",
                    "search_analyzer": "jieba_index"
                }
            }
        }
    }
}

在生產化境中,因為業務的需要,需要考慮實現以下功能:

  1. 支持同義詞;
  2. 支持字元過濾器;

結巴插件提供的分析器jieba_index、jieba_search無法實現以上功能。

自定義分析器

當jieba_index、jieba_search分析器不滿足生成環境的需求時,我們可以使用自定義分析器來解決以上問題。

分析器是由字元過濾器,分詞器,詞元過濾器組成的。

一個分詞器允許包含多個字元過濾器+一個分詞器+多個詞元過濾器。

因業務的需求,我們需要使用映射字元過濾器來實現分詞前某些字元串的替換操作。如將用戶輸入的c#替換為csharp,c++替換為cplus。

下麵逐一介紹分析器各個組成部分。

1. 映射字元過濾器Mapping Char Filter

這個是Elastic Search內置的映射字元過濾器,位於settings –> analysis -> char_filter下:

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "mapping_filter": {
                    "type": "mapping",
                    "mappings": [
                      "c# => csharp",
                      "c++ => cplus"
                  ]
                }
            }
        }
    }
}

也可以通過文件載入字元映射表。

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "mapping_filter": {
                    "type": "mapping",
                    "mappings_path": "mappings.txt"
                }
            }
        }
    }
}

文件預設存放config目錄下,即config/ mappings.txt。

2. 結巴分詞詞元過濾器JiebaTokenFilter

JiebaTokenFilter接受一個SegMode參數,該參數有兩個可選值:Index和Search。

我們預先定義兩個詞元過濾器:jieba_index_filter和jieba_search_filter。

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "jieba_index_filter": {
                    "type": "jieba",
                    "seg_mode": "index"
                },
                "jieba_search_filter": {
                    "type": "jieba",
                    "seg_mode": "search"
                }
            }
        }
    }
}

 這兩個詞元過濾器將分別用於索引分析器和查詢分析器。

3. stop 停用詞詞元過濾器

因分詞詞元過濾器JiebaTokenFilter並不處理停用詞。因此我們在自定義分析器時,需要定義停用詞詞元過濾器來處理停用詞。 

Elastic Search提供了停用詞詞元過濾器,我們可以這樣來定義:

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

也可以通過文件載入停用詞列表 

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "stop_filter": {
                    "type": "stop",
                    "stopwords_path": "stopwords.txt"
                }
            }
        }
    }
}

文件預設存放config目錄下,即config/ stopwords.txt。

4. synonym 同義詞詞元過濾器

我們使用ElasticSearch內置同義詞詞元過濾器來實現同義詞的功能。

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "synonym_filter": {
                    "type": "synonym",
                    "stopwords": [
                      "中文,漢語,漢字"
                  ]
                }
            }
        }
    }
}

如果同義詞量比較大時,推薦使用文件的方式載入同義詞庫。

PUT /my_index
{
    "settings": {
        "analysis": {
            "filter": {
                "synonym_filter ": {
                    "type": "synonym",
                    "stopwords_path": "synonyms.txt"
                }
            }
        }
    }
}

5. 重新定義分析器jieba_index和jieba_search

Elastic Search支持多級分詞,我們使用whitespace分詞作為分詞器;併在詞元過濾器加入定義好的Jiebie分詞詞元過濾器:jieba_index_filter和jieba_search_filter。 

PUT /my_index
{
    "settings": {
        "analysis": {
            "analyzer": {
                "jieba_index": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_index_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                },
                "jieba_search": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_search_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                }
            }
        }
    }
}

註意,上面分析器的命名依然使用jieba_index和jieba_search,以便覆蓋結巴分詞插件提供的分析器。

當存在多個同名的分析器時,Elastic Search會優先使用索引配置中定義的分析器。

這樣在代碼調用層面便無需再更改。 

下麵是完整的配置:

PUT /my_index
{
    "settings": {
        "analysis": {
            "char_filter": {
                "mapping_filter": {
                    "type": "mapping",
                  "mappings_path": "mappings.txt"
                }
            }
            "filter": {
                "synonym_filter ": {
                    "type": "synonym",
                    "stopwords_path": "synonyms.txt"
                },
                "stop_filter": {
                    "type": "stop",
                    "stopwords_path": "stopwords.txt"
                },
                "jieba_index_filter": {
                    "type": "jieba",
                    "seg_mode": "index"
                },
                "jieba_search_filter": {
                    "type": "jieba",
                    "seg_mode": "search"
                }
            }
            "analyzer": {
                "jieba_index": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_index_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                },
                "jieba_search": {
                    "char_filter": [
                      "mapping_filter"
                  ],
                    "tokenizer": "whitespace",
                    "filter": [
                      "jieba_search_filter",
                      "stop_filter",
                      "synonym_filter"
                  ]
                }
            }
        }
    }
}

 參考資料:

https://www.elastic.co/guide/en/elasticsearch/reference/2.3/index.html

http://www.tuicool.com/articles/eUJJ3qF


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

-Advertisement-
Play Games
更多相關文章
  • 備份: 還原: 導入 導出數據: 參數說明: h:指明資料庫宿主機的IP u:指明資料庫的用戶名 p:指明資料庫的密碼 d:指明資料庫的名字 c:指明collection的名字 f:指明要導出那些列 o:指明到要導出的文件名 q:指明導出數據的過濾條件 ...
  • 1.安裝 brew install mongodb 2.啟動 mongod config /usr/local/etc/mongod.conf 3.顯示資料庫列表 show dibs 4.顯示當前資料庫中的集合(類似關係資料庫中的表) show collections 5.顯示用戶 show use ...
  • 下麵,列出一些實用的表達式: 1,路徑取文件名 2,空字元設置預設值 1 LEN([STRING_COLUMN]) == 0 ? "default value" : [STRING_COLUMN] 2 ISNULL([STRING_COLUMN]) ? "default value" : [STRI ...
  • 淺談Oracle12c 資料庫、用戶、CDB與PDB之間的關係名詞介紹:資料庫:資料庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,它產生 於距今六十多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以 後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管 理 ...
  • 轉自:http://samyubw.blog.51cto.com/978243/223773 MySQL的每個單表中所創建的索引長度是有限制的,且對不同存儲引擎下的表有不同的限制。 在MyISAM表中,創建組合索引時,創建的索引長度不能超過1000,註意這裡索引的長度的計算是根據表欄位設定的長度來標 ...
  • 當資料庫越來越多,連接到資料庫的應用程式,伺服器,賬號越來越多的時候,為了既能達到滿足賬號操作數據許可權需求,又不擴大其操作許可權,保證資料庫的安全性,有時候需要用角色來參與到許可權管理中,通過角色做一個許可權與訪問用不之前的映射,可以更加方便地管理許可權。 用SETUSER 切換到上面建的ReadUser賬 ...
  • 1、如果主伺服器出現問題,可以快速切換到從伺服器。 2、對與實時性要求不高或者更新不頻繁的應用可以在從伺服器上執行查詢操作,降低主伺服器的訪問壓力。將數據的讀寫進行分離從而達到負載的效果。 3、可以在從伺服器進行數據備份操作,以避免備份期間對主伺服器的影響。 ...
  • 昨天測試環境的Hbase啟動有問題,日誌中顯示: transaction type: 1 error: KeeperErrorCode = NoNode for /hbase hmaster等其他進程日誌中顯示連接不上zookeeper,發現zookeeper啟動有問題。 於是判斷可能是zookee ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...