欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
java搜索引擎lucene學(xué)習筆記 --水木尤寒的博客
搜索

Lucene搜索的api的類(lèi)主要有4個(gè) IndexSearcher ,Query(包括子類(lèi)),QueryParser,Hits
IndexSearcher是搜索的入口,他的search方法提供了搜索功能

Query有很多子類(lèi), 各種不同的子類(lèi)代表了不同的查詢(xún)條件,下文詳述

QueryParser是一個(gè)非常通用的幫助類(lèi),他的作用是把用戶(hù)輸入的文本轉換為內置的Query對象(大多數web搜索引擎都提供一個(gè)查詢(xún)輸入框來(lái)讓用戶(hù)輸入查詢(xún)條件)。QueryParser內置提供了很多語(yǔ)法來(lái)使使用可以輸入各種高級條件的Query。比如: "Hello AND world"會(huì )被解析為一個(gè)AND關(guān)系的BooleanQuery,他包含兩個(gè)TermQuery(Hell和world)。這些語(yǔ)法雖然強大,但都針對英文設計,對我們需要中文搜索來(lái)說(shuō)都不需要了解太多的Query類(lèi)型,一般幾個(gè)簡(jiǎn)單的就夠用了。QueryParser的使用如下

QueryParser.parse(String query, String field, Analyzer analyzer) throws ParseException

其中:query是用戶(hù)輸入的內容,field是搜索默認的field(其他field需要顯式指定),analyzer是用來(lái)將用戶(hù)輸入的內容也作分析處理(分詞),一般情況下這里的anaylyzer是index的時(shí)候采用的同一analyzer。

另外我們也可以自己構造一個(gè)QueryParser: new QueryParser(String field, Analyzer a)(含義同上),這樣做的好處是可以自己定義調整一些參數.

搜索結果的處理:Hits對象Hits對象是搜索結果的集合 主要有下面幾個(gè)方法
  1. length() ,這個(gè)方法記錄有多少條結果返回(lazy loading)
  2. doc(n) 返回第n個(gè)記錄
  3. id(in) 返回第n個(gè)記錄的Document ID
  4. score(n) 第n個(gè)記錄的相關(guān)度(積分)

由于搜索的結果一般比較大,從性能上考慮,Hits對象并不會(huì )真正把所有的結果全部取回,默認情況下是保留前100個(gè)記錄(對于一般的搜索引擎,100個(gè)記錄足夠了).

分頁(yè)的處理

100條記錄還是太多,我們多半會(huì )每頁(yè)顯示20條記錄,然后分為若干頁(yè)顯示,對于分頁(yè),一般有兩個(gè)辦法

  1. 在session中保留indexreader對象和hit對象,翻頁(yè)的時(shí)候提取內容
  2. 不使用session,每次都簡(jiǎn)單處理為重新查詢(xún)

lucene推薦先使用第二個(gè)辦法,即每次都重新查詢(xún),這樣做的好處是簡(jiǎn)單方便,不需要考慮session的問(wèn)題,lucene的查詢(xún)效率也能保證每次查詢(xún)時(shí)間不長(cháng),除非真正有了性能問(wèn)題,否則不用考慮第一個(gè)辦法。

緩存:RAMDirectory的用法

RAMDirectory對象很好用,通過(guò)它,我們可以把一個(gè)普通的index完全讀取到內存中,用法如下:
RAMDirectory ramDir = new RAMDirectory(dir);
這樣的ramdir效率自然比真正的文件系統快很多

Lucene的scoring算法

lucence查詢(xún)的紀錄默認按照相關(guān)度排序,這個(gè)相關(guān)度就是score,scoring的算法是比較復雜的,對于我們做應用的人似乎沒(méi)有什么幫助,(先說(shuō)一下Term: 我的理解是Term為一個(gè)獨立的查詢(xún)詞,用戶(hù)輸入的的查詢(xún)通過(guò)各種分詞,大小寫(xiě)處理(正規化),消除stopwords等)以后,會(huì )已Term為基本單位),幾個(gè)關(guān)鍵參數稍微留意一下即可。

  • Term在文章中出現的頻率量
  • 包含同一個(gè)Term的文章的頻率
  • field中的boosting參數
  • term的長(cháng)度
  • term在文章中的數量
一般來(lái)說(shuō),這些參數我們都不可能去調整, 如果你想了解更多,IndexSearcher還提供了一個(gè)explain方法, 通過(guò)傳入一個(gè)Query和document ID,你可以得到一個(gè)Explaination對象,他是對內部算法信息的簡(jiǎn)單封裝,toString()一下就可以看到詳細的說(shuō)明 創(chuàng )建Query:各種query介紹

最普通的TermQuery
TermQuery最普通, 用Term t=new Term("contents","cap"); new TermQuery(t)就可以構造
TermQuery把查詢(xún)條件視為一個(gè)key, 要求和查詢(xún)內容完全匹配,比如Field.Keyword類(lèi)型就可以使用TermQuery

RangeQuery
RangeQuery表示一個(gè)范圍的搜索條件,RangeQuery query = new RangeQuery(begin, end, included);
最后一個(gè)boolean值表示是否包含邊界條件本身, 用字符表示為"[begin TO end]" 或者"{begin TO end}"

PrefixQuery
顧名思義,就是表示以某某開(kāi)頭的查詢(xún), 字符表示為"something*"

BooleanQuery
這個(gè)是一個(gè)組合的Query,你可以把各種Query添加進(jìn)去并標明他們的邏輯關(guān)系,添加條件用

public void add(Query query, boolean required, boolean prohibited)

方法, 后兩個(gè)boolean變量是標示AND OR NOT三種關(guān)系 字符表示為" AND OR NOT" 或 "+ -" ,一個(gè)BooleanQuery中可以添加多個(gè)Query, 如果超過(guò)setMaxClauseCount(int)的值(默認1024個(gè))的話(huà),會(huì )拋出TooManyClauses錯誤.

PhraseQuery
表示不嚴格語(yǔ)句的查詢(xún),比如"red pig"要匹配"red fat pig","red fat big pig"等,PhraseQuery所以提供了一個(gè)setSlop()參數,在查詢(xún)中,lucene會(huì )嘗試調整單詞的距離和位置,這個(gè)參數表示可以接受調整次數限制,如果實(shí)際的內容可以在這么多步內調整為完全匹配,那么就被視為匹配.在默認情況下slop的值是0, 所以默認是不支持非嚴格匹配的, 通過(guò)設置slop參數(比如"red pig"匹配"red fat pig"就需要1個(gè)slop來(lái)把pig后移動(dòng)1位),我們可以讓lucene來(lái)模糊查詢(xún). 值得注意的是,PhraseQuery不保證前后單詞的次序,在上面的例子中,"pig red"需要2個(gè)slop,也就是如果slop如果大于等于2,那么"pig red"也會(huì )被認為是匹配的.

WildcardQuery
使用?和*來(lái)表示一個(gè)或多個(gè)字母比如wil*可以匹配 wild ,wila ,wilxaaaa...,值得注意的是,在wildcard中,只要是匹配上的紀錄,他們的相關(guān)度都是一樣的,比如wilxaaaa和wild的對于wil*的相關(guān)度就是一樣的.

FuzzyQuery
這個(gè)Query對中文沒(méi)有什么用處,他能模糊匹配英文單詞(前面的都是詞組),比如fuzzy和wuzzy他們可以看成類(lèi)似, 對于英文的各種時(shí)態(tài)變化和復數形式,這個(gè)FuzzyQuery還算有用,匹配結果的相關(guān)度是不一樣的.字符表示為 "fuzzy~"

QueryParser使用

對于搜索引擎, 很多情況下用戶(hù)只需要一個(gè)輸入框就要輸入所有的查詢(xún)條件(比如google), 這時(shí),QueryParser就派上用場(chǎng)了,他的作用就是把各種用戶(hù)輸入轉為Query或者Query組, 他把上面提到的Query的字符表示(Query.toString)轉化為實(shí)際的Query對象,比如"wuzzy~"就會(huì )轉換為FuzzyQuery, 不過(guò)QueryParser用到了Analyzer,所以QueryParser parse過(guò)后的Query再toString未必和原來(lái)的一樣.Query額外的語(yǔ)法有:

分組:Groupping
比如"(a AND b) or C",就是括號分組,很容易理解

FieldSelectiong
QueryParser的查詢(xún)條件是對默認的Field進(jìn)行的, 它在QueryParser解析的時(shí)候編碼指定, 如果用戶(hù)需要在查詢(xún)條件中選用另外的Field, 可以使用如下語(yǔ)法: fieldname:fielda, 如果是多個(gè)分組,可以用fieldname:(fielda fieldb fieldc)表示.

*號問(wèn)題
QueryParse默認不允許*號出現在開(kāi)始部分,這樣做的目的主要是為了防止用戶(hù)誤輸入*來(lái)頭導致嚴重的性能問(wèn)題(會(huì )把所有記錄讀出)

boosting
通過(guò)hello^2.0 可以對hello這個(gè)term進(jìn)行boosting,(我想不到什么用戶(hù)會(huì )這樣么bt)

QueryParser是一個(gè)準備好的,立即可以工作的幫助類(lèi),不過(guò)他還是提供了很多參數供程序員調整,首先,我們需要自己構造一個(gè)新的QueryParser,然后對他的各種參數來(lái)定制化.

本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
關(guān)于lucene 結構及內層的研究(一)
lucene、lucene.NET詳細使用與優(yōu)化詳解
lucene--過(guò)濾器- 對搜索結果進(jìn)行過(guò)濾
lucene多種搜索方式詳解例子
Lucene 簡(jiǎn)介(一)
索引維護:添加,刪除,修改與維護
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久