1. 程式人生 > >Elasticsearch多語言搜尋入門(一)

Elasticsearch多語言搜尋入門(一)

Elasticsearch自帶一套語言分析器(Analyzer),為世界上大多數語言提供良好的支援。Elasticsearch主要支援的語言有:阿拉伯語語、 亞美尼亞語、 巴斯克語、 巴西語、 保加利亞語、 加泰羅尼亞語、 中文、 捷克語、 丹麥語、 荷蘭語、 英語、 芬蘭語、 法語、 加利西亞語、 德語、 希臘語、 印地語、 匈牙利語、 印尼語、 愛爾蘭語、 義大利語、 日語、 韓語、 庫爾德語、 挪威語、 波斯語、 葡萄牙語、 羅馬尼亞語、 俄語、 西班牙語、 瑞典語、 土耳其語和泰語。

這些語言分析器通常執行下面四個任務:

(1)將文字標記為單個詞,如:
    The quick brown foxes → [The, quick, brown, foxes]

    (2)將詞變成小寫,如:
    The  →  the

   (3) 移除常用停用詞,如:
    [The, quick, brown, foxes] → [quick, brown, foxes]
    (4)從切分的詞幹中獲得詞根,如:
    foxes → fox

另外,根據某種特定的語言,每個分析器還可以對原始文字進行特定的轉換,以便對該語言進行更好的搜尋。例如,
(1) 英語分析器可以去掉所有格的形式,如:
    John's → john
   (2)法語分析器可以移除像l'、qu' 、¨或^之類的變音和母音符號,如:
    l'église→eglis
   (3) 德語分析器可以對詞(term)進行歸一化處理,如將單詞中的ä和ae替換為a,將單詞中的β替換為ss,如:
    äüßerst→ausserst

下面我們就通過例項看看如何使用語言分析器:

PUT/my_index
{
  "mappings": {
    "blog": {
      "properties": {
        "title": {
          "type":     "string",
          "analyzer":"english"
        }
      }
    }
  }
}

上面的例子就使用了ElasticSearch內建的english分析器在title欄位上建立了一個my_index索引,型別為blog。ElasticSearch內建的分析器不需要安裝配置,如果要使用IK或MMSeg之類的中文分析器,我們需要安裝這些分析器的外掛。我們可以使用下面的例子對title上欄位上的english語言解析器進行測試:

GET /my_index/_analyze?field=title&text=I'm not happyabout the foxes

執行結果為:

{
  "tokens":[
    {
     "token": "i'm",
     "start_offset": 0,
     "end_offset": 3,
     "type": "<ALPHANUM>",
     "position": 0
    },
    {
     "token": "happi",
     "start_offset": 8,
     "end_offset": 13,
     "type": "<ALPHANUM>",
      "position": 2
    },
    {
     "token": "about",
     "start_offset": 14,
     "end_offset": 19,
     "type": "<ALPHANUM>",
     "position": 3
    },
    {
     "token": "fox",
     "start_offset": 24,
     "end_offset": 29,
     "type": "<ALPHANUM>",
     "position": 5
    }
  ]
}
我們可以看到“I'mnot happy about the foxes”這句話被english分析器拆分為4個詞:i'm,happi, about, fox;句子中的not,about和the三個單詞是英文中的停用詞,沒有在被解析出來;而且,happy被解析為其詞根happi,foxes被解析為其單數形式fox。通過english分析器解析句子後,我們的搜尋會返回更多的結果,不管您輸入happiness還是not happy,您都能搜尋出這條記錄。但是,這樣解析之後,缺點是我們損失了原文的一部分資訊,我們不能根據索引判斷happy還是nothappy。

為了保持原文的精確度,我們可以使用多欄位(multifields)進行索引。首先我們使用下面的語句刪除my_index,然後使用多欄位(multifields)對title欄位進行兩次索引,一次用english分析器,另一次用standard標準分詞器。具體語句如下:

DELETE /my_index
PUT /my_index
{
 "mappings": {
    "blog":{
     "properties": {
       "title": {
         "type": "string",
         "fields": {
           "english": {
             "type":    "string",
              "analyzer": "english"
            }
          }
        }
      }
    }
  }
}

其中,title為主欄位,用的是standard標準分詞器;而後面的title.english子欄位用的是english分析器。建立多欄位索引後,我們可以利用下面的語句載入一些測試文字並檢索:

PUT /my_index/blog/1
{ "title": "I'm happy for this fox" }
 
PUT /my_index/blog/2
{ "title": "I'm not happy about my fox problem" }
 
GET /_search
{
  "query": {
    "multi_match": {
      "type":     "most_fields", 
      "query":    "not happy foxes",
      "fields": [ "title", "title.english" ]
    }
  }
}
在上面的搜尋語句中,我們使用了most_fields關鍵字對儘可能多的欄位進行匹配搜尋。搜尋結果如下:
{
  "took":109,
 "timed_out": false,
  "_shards":{
    "total": 48,
   "successful": 48,
   "failed": 0
  },
  "hits": {
    "total":2,
   "max_score": 0.10031386,
    "hits":[
      {
       "_index": "my_index",
       "_type": "blog",
       "_id": "2",
       "_score": 0.10031386,
       "_source": {
         "title": "I'm not happy about my fox problem"
        }
      },
      {
       "_index": "my_index",
       "_type": "blog",
       "_id": "1",
       "_score": 0.07141322,
       "_source": {
         "title": "I'm happy for this fox"
        }
      }
    ]
  }
}

我們可以看到,雖然兩篇文件都沒有含有我們要搜尋的foxes,但是由於title欄位上的english分析器將foxes轉換為fox,所以這兩篇文件都能被搜尋出來。另外,由於第二篇文件含有我們要檢索的單詞not,所以第二篇文件的得分score較高,被排在第一篇文件之前。

相關推薦

Elasticsearch語言搜尋入門

Elasticsearch自帶一套語言分析器(Analyzer),為世界上大多數語言提供良好的支援。Elasticsearch主要支援的語言有:阿拉伯語語、 亞美尼亞語、 巴斯克語、 巴西語、 保加利亞語、 加泰羅尼亞語、 中文、 捷克語、 丹麥語、 荷蘭語、 英語、 芬蘭

Go語言入門特性、安裝、環境搭建、第一個程序等

以及 rec 推出 eas log tell run 線程 package Go語言是谷歌推出的一種全新的編程語言,可以在不損失應用程序性能的情況下降低代碼的復雜性。谷歌首席軟件工程師羅布派克(Rob Pike)說:我們之所以開發Go,是因為過去10多年間軟件開發的難度令人

Keras入門搭建深度神經網絡DNN解決分類問題

-s pil return 進行 stat var das 部分 sof Keras介紹 ??Keras是一個開源的高層神經網絡API,由純Python編寫而成,其後端可以基於Tensorflow、Theano、MXNet以及CNTK。Keras 為支持快速實驗而生,能夠把

ElasticSearch入門

1.基本概念 1.1 常用的全文搜尋框架        1、Lucene             Apache下面的一個開源專案,高效能的、可擴充套件的工具庫,提供搜尋的基本架構;             如果開發人員需用使用的話,需用自己進行開發,成本比較大,但是效能高

Scala 語言入門基礎語法和函式使用

一、下載安裝 scala 將下載好的scala-2.12.8.zip包解壓到當前目錄,配置 環境變數 配置path  和 classpath 編寫 HelloWorld.scala檔案 object HelloWorld{ def main(args:A

菜鳥攻略——C語言檔案程式設計初探

      發現有很多童鞋學了一年半載的C語言還不會多檔案程式設計。很多人到現在一個程式都只有一個原始檔(main.cpp或mian.c)。甚至連我的室友大飛哥(我們都大二下學期了)昨天也問我怎麼做。

C語言入門

--------------本人C#程式設計師,因為對c語言有濃厚的興趣,故自行研究,寫的不好之處可以評論告訴我,互相交流 。 C語言入門篇(一) 1.計算機的組成   計算機的組成分為硬體系統和軟體系統   (1)硬體系統:           主機:中央處理器,記憶體等   

Java執行緒學習Java執行緒入門

Java 併發的基礎知識,可能會在筆試中遇到,技術面試中也可能以併發知識環節提問的第一個問題出現。比如面試官可能會問你:“談談自己對於程序和執行緒的理解,兩者的區別是什麼?” 一 程序和多執行緒簡介 1.1 程序和執行緒 程序和執行緒的對比這一知識點

ElasticSearch 圖片搜尋外掛

一, 關於ElasticSearch ElasticSearch 是基於 Lucene 的分散式搜尋引擎。 雖然Lucene 從 版本6 開始內部使用了bkd樹使得多維搜尋問題得到顯著優化,但是 ElasticSearch 實際只在 numeric range 問題上使用了

執行緒程式設計入門

多執行緒簡介 1: 什麼是多執行緒 多執行緒,是指從軟體或者硬體上實現多個執行緒併發執行的技術。具有多執行緒能力的計算機因有硬體支援而能夠在同一時間執行多於一個執行緒,進而提升整體處理效能。具有這種能力的系統包括對稱多處理機、多核心處理器以及晶片級多處理

Python入門:單行字串,行字串和Unicode字串

1 單行字串 字串可以用''或者""括起來表示。如果字串本身包含 ',可以用" "括起來表示,比如 "I'm OK"  類似的,如果字串包含",我們就可以用' '括起來表示: 'Learn "Python".'  如果字串既包含'又包含"怎麼辦?這個時候,就需要對字串

dart語言入門

箭頭 腳本 adf tin 關系 可變 移動 urn 下標 dart 目前可用於全平臺開發,是一門面向對象的編程語言; 應用場景; web開發 跨平臺移動應用開發(flutter) 腳本或者服務端開發 語言入門 數據類型 變量: 使用 var聲明變量,可賦予不同

c語言-單鏈表

printf blog 定義 單鏈表 mage 操作 img 生成 return 定義節點: typedef struct Node { int data; Node* pNext; }NODE, *PNODE; 細節說明,PNode 就代表str

python入門

html pre uic 程序 添加 -a 控制臺 命令 成了 第一步,我們先來安裝Python,博主選擇的版本是最新的3.4.2版本。windows下面的Python安裝一般是通過軟件安裝包安裝而不是命令行,所以我們首先要在Python的官方主頁上面下載最新的Python

數據庫入門

數據庫入門 數據庫軟件 java平臺 1.數據保存 數據保存在內存: 優點: 存取速度快 缺點: 數據不能永遠保存 數據保存在文件: 優點: 數據永遠保存 缺點:

HTML5入門—— 基本標簽&表格

詳細信息 樣式設置 定位 content 瀏覽器中 解釋 加載 郵箱 常用 一、HTML簡介 超文本標簽語言,即網頁的源碼。而瀏覽器就是翻譯解釋HTML源碼的工具。 二、HTML Head部分 <1>Head的作用

ServiceStack.OrmLite 入門

repo pan ssi database open() clas demo int() mas 軟件環境: Win7 x64 SP1 SQL Server 2008r2 Visual Studio 2017 Professional 目標:取出示例數據庫

c 語言學習筆記基礎

lac alert https 內容 con 標記 prime c++ prime c基礎 近期工作上有對C語言算法上的需求,所以要學C,上學的時候沒學過,只學過半年的Java(我是專升本,本科學的材料),2015年工作後也學過C,那時候的需求是能看懂就可以,也就沒深入研究

磁盤及文件管理系統入門

fs 硬盤 uefi&gpt linux磁盤及文件系統管理初步目錄 1.磁盤及文件系統管理 2.機械磁盤結構 3.mknod命令 4.parted命令 5.GPT分區&UEFI 6.二進制單位Linux系統管理磁盤分區及文件系統管理RAIDLV

Docker入門

docker cgroup aufs unionfs dm md 一、虛擬化技術分類1.內核級別的虛擬化Xen或者Kvm [vm.user] [vm.kern].... //這種虛擬化技術隔離效果最好,但是性能消耗也高 =========== VMM ====== 硬件 vm的us