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
<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 擴充套件 回到目錄