国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

簡述Lucene的分析過程

開發 開發工具
Lucene是apache軟件基金會4 jakarta項目組的一個子項目,是一個開放源代碼的全文檢索引擎工具包,即它不是一個完整的全文檢索引擎,而是一個全文檢索引擎的架構,提供了完整的查詢引擎和索引引擎,部分文本分析引擎(英文與德文兩種西方語言)。

 回顧倒排索引的構建

Image(3)

  1. 收集待建索引的原文檔(Document)
  2. 將原文檔傳給詞條化工具(Tokenizer)進行文本詞條化
  3. 將第二步得到的詞條(Token)傳給語言分析工具(Linguistic modules)進行語言學預處理,得到詞項(Term)
  4. 將得到的詞項(Term)傳給索引組件(Indexer),建立倒排索引

注:詳細文檔->倒排索引的理論過程見詞項詞典及倒排記錄表

分析操作的使用場景

1.如上,倒排索引的構建階段

2.針對自由文本的查詢階段

QueryParser parser = new QueryParser(Version.LUCENE_36, field, analyzer);

Query query = parser.parse(queryString);

lucene的Analyzer接收表達式queryString中連續的獨立的文本片段,但不會接收整個表達式。

例如:對查詢語句"president obama" + harvard + professor,QueryParser會3次調用分析器,首先是處理文本“president obama”,然后是文本“harvard”,***處理“professor”。

3.搜索結果中高亮顯示被搜索內容時(即結果摘要-Snippets的生成),也可能會用到分析操作

剖析lucene分析器

抽象類Analyzer

Analyzer類是一個抽象類,是所有分析器的基類。

其主要包含兩個接口,用于生成TokenStream(所謂TokenStream,后面我們會講到,是一個由分詞后的Token 結果組成的流,能夠不斷的得到下一個分成的Token。)。

接口:

1.TokenStream tokenStream(String fieldName, Reader reader)

2.TokenStream reusableTokenStream(String fieldName, Reader reader)

為了提高性能,使得在同一個線程中無需再生成新的TokenStream 對象,老的可以被重用,所以有reusableTokenStream 一說。

Analyzer 中有CloseableThreadLocal<Object> tokenStreams = newCloseableThreadLocal<Object>(); 成員變量, 保存當前線程原來創建過的TokenStream , 可用函數setPreviousTokenStream 設定,用函數getPreviousTokenStream 得到。在reusableTokenStream 函數中,往往用getPreviousTokenStream 得到老的TokenStream 對象,然后將TokenStream 對象reset 一下,從而可以重新開始得到Token 流。

抽象類ReusableAnalyzerBase

ReusableAnalyzerBase extendsAnalyzer,顧名思義主要為tokenStream的重用。

其包含一個接口,用于生成TokenStreamComponents。

接口:

TokenStreamComponents createComponents(String fieldName,Reader reader);

reusableTokenStream的實現代碼分析:

 
  1. public final TokenStream reusableTokenStream(final String fieldName, 
  2.     final Reader reader) throws IOException { 
  3.   // 得到上一次使用的TokenStream 
  4.   TokenStreamComponents streamChain = (TokenStreamComponents)getPreviousTokenStream(); 
  5.   final Reader r = initReader(reader); 
  6.   //如果沒有PreviousTokenStream則生成新的, 并且用setPreviousTokenStream放入成員變量,使得下一個可用。 
  7.   //如果上一次生成過TokenStream,則reset。reset失敗則生成新的。 
  8.   if (streamChain == null || !streamChain.reset(r)) { 
  9.     streamChain = createComponents(fieldName, r); 
  10.     setPreviousTokenStream(streamChain); 
  11.   } 
  12.   return streamChain.getTokenStream(); 

內部static類TokenStreamComponents

簡單封裝輸入Tokenizer和輸出TokenStream。

最簡單的一個Analyzer:SimpleAnalyzer

SimpleAnalyzer extendsReusableAnalyzerBase,實現createComponents方法。TokenStream的處理是將字符串最小化,生成按照空格分隔的Token流

 
  1. protected TokenStreamComponents createComponents( final String fieldName, 
  2.      final Reader reader) { 
  3.    return new TokenStreamComponents(new LowerCaseTokenizer(matchVersion , reader)); 
  4.  } 

抽象類TokenStream

TokenStream 主要包含以下幾個方法:
1. boolean incrementToken()用于得到下一個Token。IndexWriter調用此方法推動Token流到下一個Token。實現類必須實現此方法并更新Attribute信息到下一個Token。
2. public void reset() 重設Token流到開始,使得此TokenStrean 可以重新開始返回各個分詞。

和原來的TokenStream返回一個Token 對象不同,Lucene 3.0 開始,TokenStream已經不返回Token對象了,那么如何保存下一個Token 的信息呢?
在Lucene 3.0 中,TokenStream 是繼承于AttributeSource,其包含Map,保存從class 到對象的映射,從而可以保存不同類型的對象的值。在TokenStream 中,經常用到的對象是CharTermAttributeImpl,用來保存Token 字符串;PositionIncrementAttributeImpl 用來保存位置信息;OffsetAttributeImpl 用來保存偏移量信息。所以當生成TokenStream 的時候, 往往調用CharTermAttribute tokenAtt = addAttribute(CharTermAttribute.class)將CharTermAttributeImpl添加到Map 中,并保存一個成員變量。在incrementToken() 中, 將下一個Token 的信息寫入當前的tokenAtt , 然后使用CharTermAttributeImpl.buffer()得到Token 的字符串。

注:Lucene 3.1開始廢棄了TermAttribute和TermAttributeImpl,用CharTermAttribute和CharTermAttributeImpl代替。

Token attributes

如上述,Token的信息真正存在于各個AttributeImpl中,lucene內建的所有Attribute接口都在org.apache.lucene.analysis.tokenattributes包中。

Token attributes API的使用

1. 調用addAttribute(繼承于AttributeSource)方法,返回一個對應屬性接口的實現類,以獲得需要的屬性。

2. 遞歸TokenStream incrementToken()方法,遍歷Token流。當incrementToken返回true時,其中Token的屬性信息會將內部狀態修改為下個詞匯單元。

3. lucene內建Attribute接口都是可讀寫的,TokenStream 在遍歷Token流時,會調用Attribute接口的set方法,修改屬性信息。

lucene內建常用Attribute接口

1. CharTermAttribute      保存Token對應的term文本,Lucene 3.1開始用CharTermAttribute代替TermAttribute

2. FlagsAttribute             自定義標志位

3. OffsetAttribute            startOffset是指Term的起始字符在原始文本中的位置,endOffset則表示Term文本終止字符的下一個位置。偏移量常用于搜索結果中高亮Snippets的生成

4. PayloadAttribute          保存有效負載

5. TypeAttribute              保存Token類型,默認為"word",實際中可根據Term的詞性來做自定義操作

6. PositionIncrementAttribute 

保存相對于前一個Term的位置信息,默認值設為1,表示所有的Term都是連續的,在位置上是一個接一個的。如果位置增量大于1,則表示Term之間有空隙,可以用這個空隙來表示被刪除的Term項(如停用詞)。位置增量為0,則表示該Term項與前一個Term項在相同的位置上,0增量常用來表示詞項之間是同義詞。位置增量因子會直接影響短語查詢和跨度查詢,因為這些查詢需要知道各個Term項之間的距離。

注:并不是所有的Attribute信息都會保存在索引中,很多Attribute信息只在分析過程使用,Term進索引后部分Attribute信息即丟棄。(如TypeAttribute、FlagsAttribute在索引階段都會被丟棄)

Lucene Token流 揭秘

lucene Token流的生成,主要依賴TokenStream 的兩個子類Tokenizer和TokenFilter

tokenstream

Tokenizer類的主要作用:接收Read對象,讀取字符串進行分詞并創建Term項。

TokenFilter類使用裝飾者模式(lucene in action中作者寫的是組合模式,本人竊以為應該是裝飾者模式),封裝另一個TokenStream類,主要負責處理輸入的Token項,然后通過新增、刪除或修改Attribute的方式來修改Term流。

Image(25)

如上圖,當Analyzer從它的tokenStream方法或者reusableTokenStream方法返回tokenStream對象后,它就開始用一個Tokenizer對象創建初始Term序列,然后再鏈接任意數量的TokenFilter來修改這些Token流。這被稱為分析器鏈(analyzer chain)。

一個簡單的Analyzer:StopAnalyzer

 
  1. protected TokenStreamComponents createComponents(String fieldName, 
  2.     Reader reader) { 
  3.   //LowerCaseTokenizer接收Reader,根據Character.isLetter(char)來進行分詞,并轉換為字符小寫 
  4.   final Tokenizer source = new LowerCaseTokenizer(matchVersion , reader); 
  5.   //只有一個分析器鏈StopFilter,來去除停用詞 
  6.   return new TokenStreamComponents(source, new StopFilter(matchVersion , 
  7.         source, stopwords)); 
 

StopAnalyzer測試

 
  1. String text = "The quick brown fox jumped over the lazy dog"
  2. System. out.println("Analyzing \"" + text + "\""); 
  3. Analyzer analyzer = new StopAnalyzer(Version.LUCENE_36); 
  4. String name = analyzer.getClass().getSimpleName(); 
  5. System. out.println("" + name + ":"); 
  6. System. out.print("" ); 
  7. AnalyzerUtils. displayTokens(analyzer, text); 
  8. System. out.println("\n" ); 
 

結果輸出

Analyzing "The quick brown fox jumped over the lazy dog"

  StopAnalyzer:

    [quick] [brown] [fox] [jumped] [over] [lazy] [dog]

原文鏈接:http://www.cnblogs.com/lori/archive/2012/08/24/2654275.html

【編輯推薦】

責任編輯:彭凡 來源: 博客園
相關推薦

2010-06-12 10:31:44

Ubuntu Grub

2009-11-23 16:17:02

Visual Stud

2009-11-02 13:29:45

Visual Stud

2009-12-21 13:59:28

Linux安裝過程

2011-12-30 09:11:30

需求分析

2022-01-12 06:59:02

C#程序集裝載

2010-09-01 15:17:04

DHCP工作過程

2017-02-28 21:23:34

大數據采集架構分析

2010-01-12 10:29:51

VB.NET對象串行化

2022-03-07 07:57:04

Linux工具內存

2021-03-11 08:10:48

JVM對象的創建School

2010-04-26 18:17:19

Oracle存儲過程

2022-09-05 08:03:28

MySQL崩潰恢復

2021-05-13 21:51:38

鴻蒙HarmonyOS應用

2014-01-06 16:38:29

MesosApache

2021-03-02 11:29:50

算法算法分析前端

2025-06-25 09:06:18

2009-09-09 14:20:49

LINQ To Luc

2010-07-27 14:52:37

Batch Telne

2009-09-23 09:16:25

Hibernate復合
點贊
收藏

51CTO技術棧公眾號

国语自产精品视频在线看| 校园春色 亚洲色图| 国产精品视屏| 亚洲综合在线免费观看| 欧美久久在线| 欧美一区二区三| 中文欧美在线视频| 精品欧美色视频网站在线观看| 中文字幕欧美激情一区| 久久成人一区| 91极品视频在线| 丝袜美腿诱惑一区二区三区| 老鸭窝91久久精品色噜噜导演| 国语自产精品视频在线看一大j8| 精品黄色免费中文电影在线播放| 一区二区三区91| 免费在线精品视频| 日韩午夜一区| 成人免费看黄网站| 欧美电影在线观看完整版| 精品在线观看国产| 在线观看a视频| 狠狠久久五月精品中文字幕| 艹b视频在线观看| 91在线精品一区二区| 国产卡一卡二在线| 国产午夜久久| 国产日韩在线一区二区三区| 色婷婷热久久| 日韩免费av在线| 亚洲午夜精品| 久久精品视频在线观看| 亚洲天堂免费电影| 精品国产成人在线影院| av电影在线播放高清免费观看| 亚洲三级在线看| 无人在线观看的免费高清视频| 国产一区欧美一区| 中文字幕成人一区| 视频在线观看91| 精品一区在线播放| 亚洲国产导航| 国产欧美日韩伦理| 亚洲乱亚洲高清| 久久一区二区三区欧美亚洲| 亚洲激情一区| 久久大片网站| 久久成人在线| 亚洲一区二区三区色| 日韩在线卡一卡二| 亚洲最大色综合成人av| 免费成人av在线播放| 麻豆视频传媒入口| 成人av在线播放网站| 人妻无码视频一区二区三区| 久久亚洲欧美国产精品乐播| 欧美三级理论片| 亚洲欧美日韩久久| 色网在线视频| 欧美影院精品一区| 午夜小视频福利在线观看| 亚洲精品av在线| 欧美色片在线观看| 久久成人国产精品| 最近国产精品视频| 91日韩在线视频| 玖玖国产精品视频| 日韩精品在线观看av| 中文字幕国产一区| 中文字幕网在线| 欧美一级夜夜爽| www.com.cn成人| 久久国产精品首页| 日韩国产欧美| 色狠狠久久av五月综合|| 国产成人午夜片在线观看高清观看| 国产精品亚洲a| 亚洲mv在线观看| 成人免费网址| 精品精品国产国产自在线| 亚洲理论电影| 欧美区高清在线| 99国产欧美另类久久久精品| 满满都是荷尔蒙韩剧在线观看| 5月丁香婷婷综合| 91精品店在线| 国产精品免费久久久久影院| 亚洲免费在线| 午夜激情在线观看视频| 色94色欧美sute亚洲线路一久| 国产白丝在线观看| 欧美激情啊啊啊| 国内视频精品| 国产成人在线小视频| 亚洲欧美日韩国产综合在线| 亚洲wwwww| 久久久久女教师免费一区| 中文字幕一区二区三区久久网站| 亚洲欧美日产图| 亚洲视频一区二区免费在线观看| 免费高清完整在线观看| 欧美大学生性色视频| 一区视频在线| 亚洲中文字幕无码不卡电影| 欧美日韩一区二区在线观看| 99久久久成人国产精品| 成人片在线免费看| 久久久久99精品一区| 丝袜美腿美女被狂躁在线观看 | 第84页国产精品| 欧美大成色www永久网站婷| 日韩国产欧美| 97在线国产视频| 欧美性感一区二区三区| 精品一区二区三区亚洲| 久久久久国产精品视频| 国产精品丝袜一区| 国产后进白嫩翘臀在线观看视频| 日本欧美一级片| 国产精品1区二区.| 国产免费av高清在线| 欧美精品videosex性欧美| 肉色丝袜一区二区| 在线播放你懂得| 久久久久国产精品www| 免费成人在线视频观看| 邻家有女韩剧在线观看国语| 久久久久久久成人| 免费成人美女在线观看.| 国产中文字幕在线观看| 7777kkkk成人观看| 国产成人啪午夜精品网站男同| 98在线视频| 国产精品久久久av久久久| 久久亚洲一级片| 625成人欧美午夜电影| 久久手机视频| 色综合av在线| 国产欧美日韩视频在线| 久草在线在线视频| 欧美大尺度激情区在线播放| 成人动漫一区二区| 成人香蕉视频| 9999在线观看| 亚洲国产精品字幕| 日日嗨av一区二区三区四区| 日韩欧美在线番号| 国产一区二区丝袜| 一区二区三区四区不卡在线| 牛牛影视久久网| 国产精品涩涩涩视频网站| 色悠悠国产精品| 国产成人免费视频一区| 无遮挡在线观看| 亚洲免费久久| 精品国产一区二区三区不卡| 9色精品在线| 日本在线观看www| 久久人人九九| 欧美不卡一区二区三区| 国产视频一区欧美| 色网站免费在线观看| 岛国一区二区三区高清视频| 欧美中文一区二区三区| 亚洲无线一线二线三线区别av| 中文字幕在线观看第一页| 91精品久久久久久久| 日韩欧美亚洲范冰冰与中字| 午夜av一区| 亚洲精品一区在线观看| 中文字幕一区图| 91亚洲免费视频| 国产不卡av在线免费观看| 亚洲国产美国国产综合一区二区| 国产一区二区电影在线观看| 日本24小时在线高清视频| www久久99| 精品国产免费人成电影在线观看四季| 青青草97国产精品免费观看| 欧美黑人粗大| 丰满少妇被猛烈进入高清播放| 久久久免费在线观看| 亚洲国产精品天堂| 最新国产拍偷乱拍精品| 91www在线| 日韩精品一区二区三区久久| 91精品国产91久久久久久久久 | 在线观看17c| 欧美成人黑人xx视频免费观看| 中文字幕一区二区三区不卡 | 国产女主播一区| 精品国产乱码久久久久久果冻传媒| 最大av网站| 国产伦一区二区三区色一情| 精品国产乱码久久久久久久久 | 免费观看日韩毛片| 欧美一区二三区| 欧美三区免费完整视频在线观看| 97视频在线观看播放| 黄页网站在线观看免费|