freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

18lucene學(xué)習(xí)總結(jié)之七:lucene搜索過程解析(3)(編輯修改稿)

2024-12-09 14:12 本頁面
 

【文章內(nèi)容簡介】 anQueryRewrite采取方式二,其 rewrite函數(shù)代碼如下: public Query rewrite(IndexReader reader, MultiTermQuery query) throws IOException { //得到 MultiTermQuery的 Term枚舉器 FilteredTermEnum enumerator = (reader)。 BooleanQuery result = new BooleanQuery(true)。 int count = 0。 try { //一個循環(huán),取出對應(yīng) MultiTermQuery的所有的 Term,加入 BooleanQuery do { Term t = ()。 if (t != null) { TermQuery tq = new TermQuery(t)。 (() * ())。 (tq, )。 count++。 } } while (())。 } finally { ()。 } (count)。 return result。 } ? 以上兩種方式各有優(yōu)劣: o 方式一使得 MultiTermQuery對應(yīng)的所有的 Term看成一個 Term,組成一個docid set,作為統(tǒng)一的倒排表參與倒排表的合并,這樣無論這樣的 Term在索引中有多少,都只會有一個倒排表參與合并,不會產(chǎn)生 TooManyClauses異常,也使得性能得到提高。但是多個 Term之間的 tf, idf等差別將被忽略,所以采用方式二的 RewriteMethod為 ConstantScoreXXX,也即除了用戶指定的 Query boost,其他的打分計(jì)算全部忽略。 o 方式二使得整個 Query對象樹被展開,葉子節(jié)點(diǎn)都為 TermQuery,MultiTermQuery中的多個 Term可根據(jù)在索引中的 tf, idf等參與打分計(jì)算,然而我們事先并不知道索引中和 MultiTermQuery相對應(yīng)的 Term到底有多少個,因而會出現(xiàn) TooManyClauses異常,也即一個 BooleanQuery中的子查詢太多。這樣會造成要合并的倒排表非常多,從而影響性能。 o Lucene認(rèn)為對于 MultiTermQuery這種查詢,打分計(jì)算忽略是很合理的,因?yàn)楫?dāng)用戶輸入 appl*的時候,他并不知道索引中有什么與此相關(guān),也并不偏愛其中之一,因而計(jì)算這些詞之間 的差別對用戶來講是沒有意義的。從而Lucene對方式二也提供了 ConstantScoreXXX,來提高搜索過程的性能,從后面的例子來看,會影響文檔打分,在實(shí)際的系統(tǒng)應(yīng)用中,還是存在問題的。 o 為了兼顧上述兩種方式, Lucene提供了 ConstantScoreAutoRewrite,來根據(jù)不同的情況,選擇不同的方式。 : public Query rewrite(IndexReader reader, MultiTermQuery query) throws IOException { final CollectionTerm pendingTerms = new ArrayListTerm()。 //計(jì)算文檔數(shù)目限制, docCountPercent默認(rèn)為 ,也即索引文檔總數(shù)的 % final int docCountCutoff = (int) ((docCountPercent / 100.) * ())。 //計(jì)算 Term數(shù)目限制,默認(rèn)為 350 final int termCountLimit = ((), termCountCutoff)。 int docVisitCount = 0。 FilteredTermEnum enumerator = (reader)。 try { //一個循環(huán),取出與 MultiTermQuery相關(guān)的所有的 Term。 while(true) { Term t = ()。 if (t != null) { (t)。 docVisitCount += (t)。 } //如果 Term數(shù)目超限,或者文檔數(shù)目超限,則可能非常影響倒排表合并的性能,因而選用方式一,也即 ConstantScoreFilterRewrite的方式 if (() = termCountLimit || docVisitCount = docCountCutoff) { Query result = new ConstantScoreQuery(new MultiTermQueryWrapperFilterMultiTermQuery(query))。 (())。 return result。 } else if (!()) { //如果 Term數(shù)目不太多,而且文檔數(shù) 目也不太多,不會影響倒排表合并的性能,因而選用 方式二,也即 ConstantScoreBooleanQueryRewrite的方式。 BooleanQuery bq = new BooleanQuery(true)。 for (final Term term: pendingTerms) { TermQuery tq = new TermQuery(term)。 (tq, )。 } Query result = new ConstantScoreQuery(new QueryWrapperFilter(bq))。 (())。 (())。 return result。 } } } finally { ()。 } } 從上面的敘述中,我們知道,在重寫 Query對象樹的時候,從 MultiTermQuery得到的TermEnum很重要,能夠得到對應(yīng) MultiTermQuery的所有的 Term,這是怎么做的的呢? MultiTermQuery的 getEnum返回的是 FilteredTermEnum,它有兩個成員變量,其中 TermEnum actualEnum是用來枚舉索引中所有的 Term的,而 Term currentTerm指向的是當(dāng)前滿足條件的 Term, FilteredTermEnum的 next()函數(shù)如下: public boolean next() throws IOException { if (actualEnum == null) return false。 currentTerm = null。 //不斷得到下一個索引中的 Term while (currentTerm == null) { if (endEnum()) return false。 if (()) { Term term = ()。 //如果當(dāng)前索引中的 Term滿足條件,則賦值為當(dāng)前的 Term if (termCompare(term)) { currentTerm = term。 return true。 } } else return false。 } currentTerm = null。 return false。 } 不同的 MultiTermQuery的 termCompare不同: ? 對于 PrefixQuery的 getEnum(IndexReader reader)得到的是 PrefixTermEnum,其 termCompare實(shí)現(xiàn)如下: protected boolean termCompare(Term term) { //只要前綴相同,就滿足條件 if (() == () amp。amp。 ().startsWith(())){ return true。 } endEnum = true。 return false。 } ? 對于 FuzzyQuery的 getEnum得到的是 FuzzyTermEnum,其 termCompare實(shí)現(xiàn)如下: protected final boolean termCompare(Term term) { //對于 FuzzyQuery,其 prefix設(shè)為空 ,也即這一條件一定滿足,只要計(jì)算的是 similarity if (field == () amp。amp。 ().startsWith(prefix)) { final String target = ().substring(())。 = similarity(target)。 return (similarity minimumSimilarity)。 } endEnum = true。 return false。 } //計(jì)算 Levenshtein distance 也即 edit distance,對于兩個字符串,從一個轉(zhuǎn)換成為另一個所需要的最少基本操作 (添加,刪除,替換 )數(shù)。 private synchronized final float similarity(final String target) { final int m = ()。 final int n = ()。 // init matrix d for (int i = 0。 i=n。 ++i) { p[i] = i。 } // start puting edit distance for (int j = 1。 j=m。 ++j) { // iterates through target int bestPossibleEditDistance = m。 final char t_j = (j1)。 // jth character of t d[0] = j。 for (int i=1。 i=n。 ++i) { // iterates through text // minimum of cell to the left+1, to the top+1, diagonally left and up +(0|1) if (t_j != (i1)) { d[i] = ((d[i1], p[i]), p[i1]) + 1。 } else { d[i] = ((d[i1]+1, p[i]+1), p[i1])。 } bestPossibleEditDistance = (bestPossibleEditDistance, d[i])。 }
點(diǎn)擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1