<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 75,comments - 83,trackbacks - 0
    Lucene搜索的api的類主要有4個 IndexSearcher ,Query(包括子類),QueryParser,Hits
    一:IndexSearcher是搜索的入口,他的search方法提供了搜索功能
    Query有很多子類, 各種不同的子類代表了不同的查詢條件,下文詳述
    QueryParser是一個非常通用的幫助類,他的作用是把用戶輸入的文本轉換為內置的Query對象(大多數web搜索引擎都提供一個查詢輸入框來讓用戶輸入查詢條件)。QueryParser內置提供了很多語法來使使用可以輸入各種高級條件的Query。比如: "Hello AND world"會被解析為一個AND關系的BooleanQuery,他包含兩個TermQuery(Hell和world)。這些語法雖然強大,但都針對英文設計,對我們需要中文搜索來說都不需要了解太多的Query類型,一般幾個簡單的就夠用了。QueryParser的使用如下
    QueryParser.parse(String query, String field, Analyzer analyzer) throws ParseException
    其中:query是用戶輸入的內容,field是搜索默認的field(其他field需要顯式指定),analyzer是用來將用戶輸入的內容也作分析處理(分詞),一般情況下這里的anaylyzer是index的時候采用的同一analyzer。
    另外我們也可以自己構造一個QueryParser: new QueryParser(String field, Analyzer a)(含義同上),這樣做的好處是可以自己定義調整一些參數.
    搜索結果的處理:Hits對象
    Hits對象是搜索結果的集合 主要有下面幾個方法
    length() ,這個方法記錄有多少條結果返回(lazy loading)
    doc(n) 返回第n個記錄
    id(in) 返回第n個記錄的Document ID
    score(n) 第n個記錄的相關度(積分)
    由于搜索的結果一般比較大,從性能上考慮,Hits對象并不會真正把所有的結果全部取回,默認情況下是保留前100個記錄(對于一般的搜索引擎,100個記錄足夠了).
    分頁的處理
    100條記錄還是太多,我們多半會每頁顯示20條記錄,然后分為若干頁顯示,對于分頁,一般有兩個辦法
    在session中保留indexreader對象和hit對象,翻頁的時候提取內容
    不使用session,每次都簡單處理為重新查詢
    lucene推薦先使用第二個辦法,即每次都重新查詢,這樣做的好處是簡單方便,不需要考慮session的問題,lucene的查詢效率也能保證每次查詢時間不長,除非真正有了性能問題,否則不用考慮第一個辦法。
    緩存:RAMDirectory的用法
    RAMDirectory對象很好用,通過它,我們可以把一個普通的index完全讀取到內存中,用法如下:
    RAMDirectory ramDir = new RAMDirectory(dir);
    這樣的ramdir效率自然比真正的文件系統快很多
    Lucene的scoring算法
    lucence查詢的紀錄默認按照相關度排序,這個相關度就是score,scoring的算法是比較復雜的,對于我們做應用的人似乎沒有什么幫助,(先說一下Term: 我的理解是Term為一個獨立的查詢詞,用戶輸入的的查詢通過各種分詞,大小寫處理(正規化),消除stopwords等)以后,會已Term為基本單位),幾個關鍵參數稍微留意一下即可。
    Term在文章中出現的頻率量
    包含同一個Term的文章的頻率
    field中的boosting參數
    term的長度
    term在文章中的數量
    一般來說,這些參數我們都不可能去調整, 如果你想了解更多,IndexSearcher還提供了一個explain方法, 通過傳入一個Query和document ID,你可以得到一個Explaination對象,他是對內部算法信息的簡單封裝,toString()一下就可以看到詳細的說明
    二:創建Query:各種query介紹
    最普通的TermQuery
    TermQuery最普通, 用Term t=new Term("contents","cap"); new TermQuery(t)就可以構造
    TermQuery把查詢條件視為一個key, 要求和查詢內容完全匹配,比如Field.Keyword類型就可以使用TermQuery
    RangeQuery
    RangeQuery表示一個范圍的搜索條件,RangeQuery query = new RangeQuery(begin, end, included);
    最后一個boolean值表示是否包含邊界條件本身, 用字符表示為"[begin TO end]" 或者"{begin TO end}"
    PrefixQuery
    顧名思義,就是表示以某某開頭的查詢, 字符表示為"something*"
    BooleanQuery
    這個是一個組合的Query,你可以把各種Query添加進去并標明他們的邏輯關系,添加條件用
    public void add(Query query, boolean required, boolean prohibited)
    方法, 后兩個boolean變量是標示AND or NOT三種關系 字符表示為" AND or NOT" 或 "+ -" ,一個BooleanQuery中可以添加多個Query, 如果超過setMaxClauseCount(int)的值(默認1024個)的話,會拋出TooManyClauses錯誤.
    PhraseQuery
    表示不嚴格語句的查詢,比如"red pig"要匹配"red fat pig","red fat big pig"等,PhraseQuery所以提供了一個setSlop()參數,在查詢中,lucene會嘗試調整單詞的距離和位置,這個參數表示可以接受調整次數限制,如果實際的內容可以在這么多步內調整為完全匹配,那么就被視為匹配.在默認情況下slop的值是0, 所以默認是不支持非嚴格匹配的, 通過設置slop參數(比如"red pig"匹配"red fat pig"就需要1個slop來把pig后移動1位),我們可以讓lucene來模糊查詢. 值得注意的是,PhraseQuery不保證前后單詞的次序,在上面的例子中,"pig red"需要2個slop,也就是如果slop如果大于等于2,那么"pig red"也會被認為是匹配的.
    WildcardQuery
    使用?和*來表示一個或多個字母比如wil*可以匹配 wild ,wila ,wilxaaaa...,值得注意的是,在wildcard中,只要是匹配上的紀錄,他們的相關度都是一樣的,比如wilxaaaa和wild的對于wil*的相關度就是一樣的.
    FuzzyQuery
    這個Query對中文沒有什么用處,他能模糊匹配英文單詞(前面的都是詞組),比如fuzzy和wuzzy他們可以看成類似, 對于英文的各種時態變化和復數形式,這個FuzzyQuery還算有用,匹配結果的相關度是不一樣的.字符表示為 "fuzzy~"
    三:QueryParser使用
    對于搜索引擎, 很多情況下用戶只需要一個輸入框就要輸入所有的查詢條件(比如google), 這時,QueryParser就派上用場了,他的作用就是把各種用戶輸入轉為Query或者Query組, 他把上面提到的Query的字符表示(Query.toString)轉化為實際的Query對象,比如"wuzzy~"就會轉換為FuzzyQuery, 不過QueryParser用到了Analyzer,所以QueryParser parse過后的Query再toString未必和原來的一樣.Query額外的語法有:
    分組:Groupping
    比如"(a AND b) or C",就是括號分組,很容易理解
    FieldSelectiong
    QueryParser的查詢條件是對默認的Field進行的, 它在QueryParser解析的時候編碼指定, 如果用戶需要在查詢條件中選用另外的Field, 可以使用如下語法: fieldname:fielda, 如果是多個分組,可以用fieldname:(fielda fieldb fieldc)表示.
    *號問題
    QueryParse默認不允許*號出現在開始部分,這樣做的目的主要是為了防止用戶誤輸入*來頭導致嚴重的性能問題(會把所有記錄讀出)
    boosting
    通過hello^2.0 可以對hello這個term進行boosting,(我想不到什么用戶會這樣么bt)
    QueryParser是一個準備好的,立即可以工作的幫助類,不過他還是提供了很多參數供程序員調整,首先,我們需要自己構造一個新的QueryParser,然后對他的各種參數來定制化
    posted on 2008-10-07 11:16 梓楓 閱讀(1191) 評論(0)  編輯  收藏 所屬分類: lucene
    主站蜘蛛池模板: 亚洲宅男天堂在线观看无病毒| 国产精品高清全国免费观看| 亚洲国产日韩成人综合天堂| 亚洲欧美日韩久久精品| 亚洲一级毛片免费在线观看| 亚洲精品亚洲人成人网| 中文字幕成人免费高清在线视频| 亚洲精品国产高清嫩草影院| 国产V片在线播放免费无码 | 亚洲国产美女视频| 最近高清中文字幕免费| 亚洲伊人久久大香线蕉影院| 免费国产成人高清在线观看网站| 亚洲乱码在线视频| 久久综合AV免费观看| 亚洲人片在线观看天堂无码| 日韩一区二区三区免费体验| 深夜a级毛片免费视频| 亚洲伊人久久精品影院| 永久免费av无码网站yy| 亚洲第一成年人网站| 好吊妞998视频免费观看在线| 亚洲av无码av在线播放| 亚洲精品无码AV中文字幕电影网站| 一级毛片aa高清免费观看| 亚洲国产成人精品无码区在线观看| 69免费视频大片| 亚洲AV永久无码精品放毛片| 亚洲国产成人精品女人久久久 | 亚洲精品午夜视频| 韩国二级毛片免费播放| ssswww日本免费网站片| 日韩亚洲AV无码一区二区不卡| 久久不见久久见中文字幕免费| 美女黄频视频大全免费的| 亚洲精品无码久久一线| 日本妇人成熟免费中文字幕 | 成人A片产无码免费视频在线观看| 亚洲黑人嫩小videos| 国产99视频免费精品是看6| 在线观看免费视频一区|