1. 程式人生 > >solr 的分析器,分詞器和分詞過濾器

solr 的分析器,分詞器和分詞過濾器

 (一) 分詞基本概念

 概覽

    當對一個文件(document是一系列field的集合)進行索引時,其中的每個field(document和file都是lucene中的概念)中的資料都會經歷分析,分詞和多步的分詞過濾等操作。這一系列的動作是什麼呢?直觀的理解是,將一句話分成單個的單詞,去掉句子當中的空白符號,去掉多餘的詞,進行同義詞代換等等。

  【例】what a beautiful day? 會進行什麼處理呢?what ,a 以及問號都將被去掉,最後處理結果為beautiful和day(也有可能是beautiful day)。

  不僅僅是在索引的時候進行這些工作,查詢的時候也要做這些工作,而且通常索引和查詢使用同樣的方法來進行處理。這樣做的目的是為了保證索引與查詢的正確匹配。下例說明了採取不同的處理時的不匹配情況。

  【例】ABCD索引分詞為AB  CD,查詢時候分詞為ABC  D,顯然查詢的匹配結果為0。

詞性轉換

  一種是將一個詞擴充套件成它的多種形式,例如將run擴充套件成runs,running。另外一種是詞性規約,例如將runns,running等都“收縮”成run。前者只需要在索引或查詢的任意一端採用即可,後者需要在兩端同時採用。

分析器(Analyzer)

  分析器是包括連個部分:分詞器和過濾器。分詞器顧名思意就是將句子分詞單個的詞,過濾器就是對分詞的結果進行篩選,例如中文中將“的”“呀”這些對句子主體意思影響不大的詞刪除。英語中類似的就是"is","a"等等。通常在索引和分詞兩端應該採用同樣的分詞器。solr自帶了一些分詞器,如果你需要使用自己公司的分詞器,那麼就需要修改solr模式(Solr schema)。

    schema.xml 檔案允許兩種方式修改文字被分析的方式,通常只有field型別為 solr.TextField 的field的內容允許定製分析器。

方法一:使用任何 org.apache.lucene.analysis.Analyzer的子類進行設定。

<fieldtype name="nametext" class="solr.TextField">
   <analyzer class="org.apache.lucene.analysis.WhitespaceAnalyzer"/>
 </fieldtype>

 方法二:指定一個TokenizerFactory

 ,後面跟一系列的TokenFilterFactories(它們將按照所列的順序發生作用),Factories被用來建立分詞器和分詞過濾器,它們用於對分詞器和分詞過濾器的準備配置,這樣做的目的是為了避免the overhead of creation via reflection。

 <fieldtype name="text" class="solr.TextField">
   <analyzer>
     <tokenizer class="solr.StandardTokenizerFactory"/>
     <filter class="solr.StandardFilterFactory"/>
     <filter class="solr.LowerCaseFilterFactory"/>
     <filter class="solr.StopFilterFactory"/>
     <filter class="solr.PorterStemFilterFactory"/>
   </analyzer>
 </fieldtype>

     需要說明的一點是,Any Analyzer, TokenizerFactory, or TokenFilterFactory 應該用帶包名的全類名進行指定,請確保它們位於Solr的classpath 路徑下。對於 org.apache.solr.analysis.* 包下的類,僅僅通過solr.*就可以進行指定。

   如果你需要使用自己的分詞器和過濾器,你就需要自己寫一個 factory ,它必須是 BaseTokenizerFactory或BaseTokenFilterFactory的子類。就像下面一樣。

  public class MyCustomFilterFactory extends BaseTokenFilterFactory {
    public TokenStream create(TokenStream input) {
    return new MyCustomFilter(input);
  }
}

TokenizerFactories

   Solr提供了下列TokenizerFactories(Tokenizers and TokenFilters)

1.solr.KeywordTokenizerFactory

    不管什麼內容,整句當成一個關鍵字
    例如: "http://example.com/I-am+example?Text=-Hello" ==> "http://example.com/I-am+example?Text=-Hello"

2.solr.LetterTokenizerFactory 

    根據字母來分詞,拋棄非字母的部分   
    例如:"I can't" ==> "I", "can", "t"

3.solr.WhitespaceTokenizerFactory
     根據空格來分詞
     例如:"I do" ==> "I", "do"

4.solr.LowerCaseTokenizerFactory
  根據字母分詞,並將所有字母轉換成小寫,拋棄非字母的部分
    例如:"I can't" ==> "i", "can", "t"

5.solr.StandardTokenizerFactory

     分詞舉例:  "I.B.M. cat's can't" ==> 
     ACRONYM: "I.B.M.", APOSTROPHE:"cat's", APOSTROPHE:"can't"
      說明:該分詞器,會自動地給每個分詞新增type,以便接下來的對type敏感的過濾器進行處理,目前僅僅只有StandardFilter對Token的型別是敏感的。

TokenFilterFactories

1.solr.LowerCaseFilterFactory



將分詞小寫,不處理非單詞部分
例如: "I.B.M.", "Solr" ==> "i.b.m.", "solr".

相關推薦

solr分析器過濾器

 (一) 分詞基本概念  概覽     當對一個文件(document是一系列field的集合)進行索引時,其中的每個field(document和file都是lucene中的概念)中的資料都會經歷分析,分詞和多步的分詞過濾等操作。這一系列的動作是什麼呢?直觀的理解是,

Solr技術配置以及資料匯入的使用

1 下載好solr 4.9.1版本 解壓solr的zip包,目錄如下。 2 將dist目錄下的solr-4.9.1.war檔案複製到tomcat的webapps目錄下,並將檔案命名為solr.war。 3 啟動tomcat,會發現solr.war已解壓成為資

基於spring boot架構word檢索排序頁實現

       本文不適合Java初學者,適合對spring boot有一定了解的同學。 文中可能涉及到一些實體類、dao類、工具類文中沒有這些類大家不必在意,不影響本文的核心內容,本文重在對方法的梳理。    word分詞器maven依賴<dependency>

DRF的註冊響應

一、DRF的註冊器 #匯入模組 from rest_framework import routers #例項化一個router物件 router = routers.DefaultRouter() #將需要自動生成url的介面註冊到router中 router.register("bookssss",

ElasticSearch學習筆記(二)IK拼音的安裝

ElasticSearch是自帶分詞器的,但是自帶的分詞器一般就只能對英文分詞,對英文的分詞只要識別空格就好了,還是很好做的(ES的這個分詞器和Lucene的分詞器很想,是不是直接使用Lucene的就不知道),自帶的分詞器對於中文就只能分成一個字一個字,這個顯然

Elasticsearch5.6.11+Ik自定義庫的配置與使用

1、Ik分詞器下載 在https://github.com/medcl/elasticsearch-analysis-ik中下載對應版本的IK分詞器elasticsearch-analysis-ik-5.6.11.zip。 2、Ik分詞器配置 在elasticsearch-5.6.11根

ElasticSearch-IK整合使用

## 1.查詢存在問題分析 在進行字串查詢時,我們發現去搜索"搜尋伺服器"和"鋼索"都可以搜尋到資料; 而在進行詞條查詢時,我們搜尋"搜尋"卻沒有搜尋到資料; 究其原因是ElasticSearch的標準分詞器導致的,當我們建立索引時,欄位使用的是標準分詞器: >如果使用ES搜尋中文內容,預設是不支援中文

Django組件——中間件

ber 處理 spa 使用 view template 中間 display temp 分頁器 Django內置分頁器(paginator) 分頁器函數為paginator,裏面有幾個重要的參數需要我們了解 paginator = Paginator(book_l

迭代部類

迭代器 迭代器是可以返回相同型別的值的有序序列的一段程式碼,可用作方法,運算子或get訪問器的程式碼體.迭代器程式碼使用yield return語句依次返回每個元素,yield break語句將終止迭代.可以在類中實現多個迭代器,每個迭代器必須像類成員一樣有唯一的名稱,並且可以在foreac

Lucene筆記20-Lucene的-實現自定義同義詞-實現(良好設計方案)

一、目前存在的問題 在getSameWords()方法中,我們使用map臨時存放了兩個鍵值對用來測試,實際開發中,往往需要很多的這種鍵值對來處理,比如從某個同義詞詞典裡面獲取值之類的,所以說,我們需要一個類,根據key提供近義詞。 為了能更好的適應應用場景,我們先定義一個介面,其中定義一

Lucene筆記19-Lucene的-實現自定義同義詞-實現

一、同義詞分詞器的程式碼實現 package com.wsy; import com.chenlb.mmseg4j.Dictionary; import com.chenlb.mmseg4j.MaxWordSeg; import com.chenlb.mmseg4j.analysis.MM

ElasticSearch中以及原理:聽課筆記(38講-45講)

第38講 第39講 第40講 第41講 分詞器:拆分詞語,做normalization(時態轉換,單複數轉換,同義詞,大小寫的轉換) 預設情況下是standard狀態,分詞的時候會將連詞and ,介詞a the an等詞幹掉 第42講

DAY102 - Rest Framework(七)- 手動編寫配置檔案、版本控制

一、手動編寫配置檔案 # 預設配置 # conf-->global_setting.py DEBUG = None TIME_ZONE = 'America/Chicago' USE_TZ = False # 使用者配置 # usersetting-->setting.py DEBUG

版本控制的總結使用

spa sch lis number from 顯示 list queryset 出版 昨日回顧: 分頁器: 普通分頁 # 普通分頁 from rest_framework.paginatio

設定 content size實現水平捲動上下捲動頁的 scroll view

研究常用 UI Kits- Phase 2_ 水平捲動水平捲動的 Scroll View水平捲動在畫面上加入寬度等於螢幕寬度的 scroll view再於 scroll view 上放一個 view,為方便操作,先將 View 拉到 的 Exit 下方,呈現畫面如下圖。在 View 上加入需要 image v

給出任意一個時間點求出指標針之間的角度

以12:00位置為起始點,那麼分針的角度則是 360*min/60 = 6min以12:00位置為起始點,那麼時針的角度則是 360*(hour%12)/12 + 360*(min/60)*(1/12)*那兩個指標之間的夾角是 (hour angle – minute an

7 Django文章

src http 技術分享 alt .com bsp 9.png image png 1 2 3 4 5 7 Django分頁器文章分頁

python---基礎知識回顧(十)進程線程(自定義線程池上下文管理協程的使用)

elf () self. 數據類型 大小 get 基礎數據類型 __init__ 進行 前戲: 在進行自定義線程池前,先了解下Queue隊列 隊列中可以存放基礎數據類型,也可以存放類,對象等特殊數據類型 from queue import Queue class T:

生成器迭代裝飾

1.生成器 解析器在實時生成資料,資料不會駐留在記憶體中。因此,其執行效率很高! yield 是一個類似 return 的關鍵字,只是這個函式返回的是個生成器 當你呼叫這個函式的時候,函式內部的程式碼並不立即執行 ,這個函式只是返回一個生成器物件 當你使用for進行迭代的時候,函式中的程

django -----元件 元件

分頁器元件 本文目錄 1 Django的分頁器(paginator)簡介 2 應用View層 3 模版層 index.html 4 擴充套件 回到目錄