這幾天在公司做乙個專案,就是去將以前的老專案的lucene版本切換成4.3版本,並將以前的索引架構修改為實時索引(公司以前的那個專案是好幾年前的了),為了和以前的版本相容,第一步就是只是把lucene版本修改下,同時支援實時索引,至於所有的介面,都要和以前一樣。在這中間就遇到了乙個很大的問題,就是在出搜尋結果的時候,修改後的版本要比以前的版本多很多搜尋結果(上面要求要和原來的介面出的資料完全一樣),函式也是用的以前的,為什麼就出現不同的結果呢?
最後通過讀源**,發現是queryparser類在作怪,下面先看一下queryparser在前後3.1前後兩個版本中的效果:
/**
*@description:
*/ package cn.lulei.test;
import org.apache.lucene.analysis.standard.standardanalyzer;
import org.apache.lucene.queryparser.classic.parseexception;
import org.apache.lucene.queryparser.classic.queryparser;
import org.apache.lucene.search.query;
import org.apache.lucene.util.version;
public class testqueryparser
@suppresswarnings("deprecation")
public static query getonefieldquery30(string key, string field) throws parseexception
public static void main(string args) throws parseexception
}
上面這個測試用例的結果為:
鬥破蒼穹30版本結果:key:"鬥 破 蒼 穹"
鬥破蒼穹43版本結果:key:鬥 key:破 key:蒼 key:穹
得出兩個完全不同的query物件,這也就是為什麼會多出這麼多的搜尋結果的原因,下面就從源**中**其原因,下面的源**均是通過反編譯軟體實現的。
先看下queryparse的構造方法:
public queryparser(version matchversion, string f, analyzer a)
在以前的版本中是沒有version這個引數的,具體從那個版本開始加的,我也不是很清楚,自己也是最近才剛開始接觸lucene的。
在進一步追一下,看起父類queryparserbase是如何實現的init(version matchversion, string f, analyzer a)方法
public void init(version matchversion, string f, analyzer a)
其中setautogeneratephrasequeries(boolean)方法修改的是類屬性allowleadingwildcard的值,這樣allowleadingwildcard的值對parse(string)的實現就有決定性的作用。
public query parse(string query) throws parseexception
catch (parseexception tme)
catch (tokenmgrerror tme)
catch (booleanquery.toomanyclauses tmc) throw e;
}
也正事因為屬性allowleadingwildcard的值,決定了了第乙個測試例項的結果,從源**中也可以看出來,3.1(包括)之前的版本和之後的版本出來兩種完全不同的結果,為什麼會做這樣的修改,我猜測可能是因為下面的原因:
key:"鬥 破 蒼 穹" 這種結果是能夠準確的定位到使用者搜尋到的結果,而且也十分準確,但是如果使用者某乙個詞輸入錯誤,或者是錯別字,那得到的就不是使用者想要的結果,甚至就搜尋不出來任何的東西。
key:鬥 key:破 key:蒼 key:穹 這種結果雖然出現的結果會有很多,但是根據lucene的打分機制,「鬥破蒼穹」這條記錄也出出現在第一條,即使使用者輸出了其中的某乙個字,一還是可以搜尋到使用者想要的結果的。
至於這兩種,那個效果比較好,自己還需大量的資料去測試,不能就根據自己的意願去認為
關於類的前向宣告
前向宣告的定義 有些時候我們可以宣告一些類但是並不去定義它,當然這個類的作用也很有限了。比如class foo 宣告乙個foo類,這個宣告,有時候也叫做前向宣告 forward declaration 在宣告完這個foo類之後,定義完這個foo類之前的時期,foo類是乙個不完全的型別 incompl...
查詢字串的解析 QueryParser類
在lucene中,這項工作就交給了queryparser類來完成,它的作用就是把各種使用者輸入的符號串轉為乙個內部的query或者乙個query組。雖然lucene提供的api允許使用者建立各種各樣的query 查詢語句 但它同時也允許通過queryparser 查詢分析器 生成各種各樣的query...
查詢字串的解析 QueryParser類
在lucene中,這項工作就交給了queryparser類來完成,它的作用就是把各種使用者輸入的符號串轉為乙個內部的query或者乙個query組。雖然lucene提供的api允許使用者建立各種各樣的query 查詢語句 但它同時也允許通過queryparser 查詢分析器 生成各種各樣的query...