elasticsearch學習筆記-倒排索引以及中文分詞

来源:http://www.cnblogs.com/dingsblog/archive/2017/06/18/7044369.html
-Advertisement-
Play Games

我們使用資料庫的時候,如果查詢條件太複雜,則會涉及到很多問題 1、無法維護,各種嵌套查詢,各種複雜的查詢,想要優化都無從下手 2、效率低下,一般語句複雜了之後,比如使用or,like %,,%查詢之後資料庫的索引就沒有辦法利用到了,這個時候的搜索就會全表掃描,數據量少的時候可能性能還能接受,但是數據 ...


我們使用資料庫的時候,如果查詢條件太複雜,則會涉及到很多問題

1、無法維護,各種嵌套查詢,各種複雜的查詢,想要優化都無從下手

2、效率低下,一般語句複雜了之後,比如使用or,like %,,%查詢之後資料庫的索引就沒有辦法利用到了,這個時候的搜索就會全表掃描,數據量少的時候可能性能還能接受,但是數據量大了之後性能會直線下降,速度慢的一塌胡蘿蔔。。

但是呢,資料庫的聚集索引查詢還是極快的,

所以我們可以利用這一點嘗試建立一下這樣的索引結構--就是把資料庫裡面的每一條記錄作為一個鍵,相同記錄的Id的集合作為值,這樣我們查詢記錄的時候就可以通過記錄快速定位到數據表的id,從而就可以快速查詢到這條數據瞭如圖所示

如果要搜索咪咪蝦條的話,就可以帶出這些value值,我們都知道key-value的查詢是非常快的,所以這個耗時會很短,然後通過id來查詢就會使得效率高出很多,這個思路可以用在所有欄位上,但是對空間的使用會多一些,不過存儲這東東還是蠻便宜的,畢竟體驗才是最重要的對吧,這種就叫基本的倒排索引。

但是如果用戶只搜索咪咪呢,如何能夠定位到這條咪咪蝦條的記錄呢?

這裡就涉及到了另一項比較重要的技術--中文分詞

這裡簡要說明下中文分詞:

中文分詞裡面有個東西必不可少,就是詞庫

假設我們的詞庫很簡單,就這麼幾條詞:1、咪咪,2、蝦,3、蝦條

這個時候,我們存入一條咪咪蝦條,id是10000的記錄的時候呢

分詞就會這麼乾,先讀第一個字,咪,然後發現沒有單個的這個詞,但是有一個咪咪,然後就會讀取第二個字,第二個字還是咪,這個時候咪咪是一個詞,然後讀取第三個字,蝦,發現蝦是單個的一個字,詞典里也有這個字,咪蝦不存在,咪咪蝦更加不存在,那麼咪咪這個詞就確定了,繼續往下讀,發現條,然後發現蝦是一個詞語,蝦條也是一個詞語,而現在已經讀完了,所以現在分詞有兩種組合,蝦和條,蝦條,顯然第一條有點扯淡,條不能作為一個詞,所以就取後者,這樣蝦條這個詞就出來了。

接著我們存入一條咪咪id 為10002的數據的時候,方法同上

然後存到搜索引擎的數據的就是這樣

這個時候就有兩條記錄,咪咪對應的有兩條記錄,蝦條對應一條

如果我們搜索蝦條的話,10000就會被搜索出來,如果搜索咪咪的話,那10002和10000就會被搜索出來

如果我們搜索咪咪蝦條的話,就會按照上面的分詞邏輯將我們的搜索條件進行分詞,然後分出來咪咪和蝦條兩個詞,然後查詢,再merge最終得到兩個id:10000,10002

分詞這塊就我所理解也就這樣了。

說了這麼多,具體怎麼做呢?其實很簡單,一個插件就搞定,我用的是IK分詞插件,安裝簡單,地址在這裡,裡面也有安裝說明,安裝完之後重啟下就ok了

https://github.com/medcl/elasticsearch-analysis-ik
中文分詞插件

目前就這麼多,本人也是剛學這個,寫的有什麼問題歡迎指出,謝謝~

 


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

-Advertisement-
Play Games
更多相關文章
  • 先看效果: 這個是用Pivot來實現 1、自定義Pivot的樣式,使用Blend工具生成模板,將HeaderTemplate的佈局都隱藏 1 <Style x:Key="PivotStyle1" TargetType="Pivot"> 2 <Setter Property="Margin" Valu ...
  • 歡迎討論歡迎一起學習:微信jkxx123321 這是一篇關於LIstView實現動態數據渲染的文章![RN] 首先我們講講數據是如何來規劃的 一般情況下我們有兩種規劃方案前提比如我們數據是100條+ 第一:一次性把100條數據fetch過來 然後由前端JS代碼來做分頁處理(如每次渲染10條) 第二: ...
  • 最近遇到一個 SQL Server 排序的問題,以前也沒瞭解過,然後這次碰到了。 才發現 SQL Server 排序的問題,在指定的排序列中 null 值會預設排在最前面,因為在 SQL Server 中 null 值預設為最小值。 後來問了一下萬能的百度,找到了下麵一種比較簡單的處理方法。 首先建 ...
  • Sql Server 2008 MSDN下載地址: http://www.msdn.hk/7/176/ 下載完成後的iso文件目錄結構如下,點擊安裝程式: 點擊安裝全新的sql server: 必備檢測項,下一步: 這裏會自動填充產品密鑰: 一直往下,選擇功能也全部選擇,下一步: 選擇默認數據庫實例 ...
  • 原文出處:Increased SOS_SCHEDULER_YIELD waits on virtual machines 註: 原文的用詞是Increased,想譯作增強(增長),或者加強,這麼譯起來是褒義詞,而原文要表達的Increased並沒有褒義的含義,最起碼是一個中性的含義,想來想起用一個“ ...
  • could not start the service MySQL .error 0 安裝時無法啟動服務 在MySQL資料庫卸載後重裝時,一定要將MySQL的相關服務,文件夾,註冊表刪除徹底 1.打開service.msc關閉MySQL服務 2.控制面板 -> 程式和功能 -> MYSQL 雙擊卸載 ...
  • 我們以Oracle自帶的表來做例子 主要兩張表:dept、emp 一個是部門,一個是員工表結構如下: emp name null? Type Empno not null number(4) ename varchar2(10) job varchar2(9) mgr number(4) hired ...
  • MySQL授權命令grant的使用方法:grant 許可權 on 資料庫對象 to 用戶 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...