<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個(gè) IndexSearcher ,Query(包括子類),QueryParser,Hits
    一:IndexSearcher是搜索的入口,他的search方法提供了搜索功能
    Query有很多子類, 各種不同的子類代表了不同的查詢條件,下文詳述
    QueryParser是一個(gè)非常通用的幫助類,他的作用是把用戶輸入的文本轉(zhuǎn)換為內(nèi)置的Query對(duì)象(大多數(shù)web搜索引擎都提供一個(gè)查詢輸入框來(lái)讓用戶輸入查詢條件)。QueryParser內(nèi)置提供了很多語(yǔ)法來(lái)使使用可以輸入各種高級(jí)條件的Query。比如: "Hello AND world"會(huì)被解析為一個(gè)AND關(guān)系的BooleanQuery,他包含兩個(gè)TermQuery(Hell和world)。這些語(yǔ)法雖然強(qiáng)大,但都針對(duì)英文設(shè)計(jì),對(duì)我們需要中文搜索來(lái)說(shuō)都不需要了解太多的Query類型,一般幾個(gè)簡(jiǎn)單的就夠用了。QueryParser的使用如下
    QueryParser.parse(String query, String field, Analyzer analyzer) throws ParseException
    其中:query是用戶輸入的內(nèi)容,field是搜索默認(rèn)的field(其他field需要顯式指定),analyzer是用來(lái)將用戶輸入的內(nèi)容也作分析處理(分詞),一般情況下這里的anaylyzer是index的時(shí)候采用的同一analyzer。
    另外我們也可以自己構(gòu)造一個(gè)QueryParser: new QueryParser(String field, Analyzer a)(含義同上),這樣做的好處是可以自己定義調(diào)整一些參數(shù).
    搜索結(jié)果的處理:Hits對(duì)象
    Hits對(duì)象是搜索結(jié)果的集合 主要有下面幾個(gè)方法
    length() ,這個(gè)方法記錄有多少條結(jié)果返回(lazy loading)
    doc(n) 返回第n個(gè)記錄
    id(in) 返回第n個(gè)記錄的Document ID
    score(n) 第n個(gè)記錄的相關(guān)度(積分)
    由于搜索的結(jié)果一般比較大,從性能上考慮,Hits對(duì)象并不會(huì)真正把所有的結(jié)果全部取回,默認(rèn)情況下是保留前100個(gè)記錄(對(duì)于一般的搜索引擎,100個(gè)記錄足夠了).
    分頁(yè)的處理
    100條記錄還是太多,我們多半會(huì)每頁(yè)顯示20條記錄,然后分為若干頁(yè)顯示,對(duì)于分頁(yè),一般有兩個(gè)辦法
    在session中保留indexreader對(duì)象和hit對(duì)象,翻頁(yè)的時(shí)候提取內(nèi)容
    不使用session,每次都簡(jiǎn)單處理為重新查詢
    lucene推薦先使用第二個(gè)辦法,即每次都重新查詢,這樣做的好處是簡(jiǎn)單方便,不需要考慮session的問(wèn)題,lucene的查詢效率也能保證每次查詢時(shí)間不長(zhǎng),除非真正有了性能問(wèn)題,否則不用考慮第一個(gè)辦法。
    緩存:RAMDirectory的用法
    RAMDirectory對(duì)象很好用,通過(guò)它,我們可以把一個(gè)普通的index完全讀取到內(nèi)存中,用法如下:
    RAMDirectory ramDir = new RAMDirectory(dir);
    這樣的ramdir效率自然比真正的文件系統(tǒng)快很多
    Lucene的scoring算法
    lucence查詢的紀(jì)錄默認(rèn)按照相關(guān)度排序,這個(gè)相關(guān)度就是score,scoring的算法是比較復(fù)雜的,對(duì)于我們做應(yīng)用的人似乎沒(méi)有什么幫助,(先說(shuō)一下Term: 我的理解是Term為一個(gè)獨(dú)立的查詢?cè)~,用戶輸入的的查詢通過(guò)各種分詞,大小寫(xiě)處理(正規(guī)化),消除stopwords等)以后,會(huì)已Term為基本單位),幾個(gè)關(guān)鍵參數(shù)稍微留意一下即可。
    Term在文章中出現(xiàn)的頻率量
    包含同一個(gè)Term的文章的頻率
    field中的boosting參數(shù)
    term的長(zhǎng)度
    term在文章中的數(shù)量
    一般來(lái)說(shuō),這些參數(shù)我們都不可能去調(diào)整, 如果你想了解更多,IndexSearcher還提供了一個(gè)explain方法, 通過(guò)傳入一個(gè)Query和document ID,你可以得到一個(gè)Explaination對(duì)象,他是對(duì)內(nèi)部算法信息的簡(jiǎn)單封裝,toString()一下就可以看到詳細(xì)的說(shuō)明
    二:創(chuàng)建Query:各種query介紹
    最普通的TermQuery
    TermQuery最普通, 用Term t=new Term("contents","cap"); new TermQuery(t)就可以構(gòu)造
    TermQuery把查詢條件視為一個(gè)key, 要求和查詢內(nèi)容完全匹配,比如Field.Keyword類型就可以使用TermQuery
    RangeQuery
    RangeQuery表示一個(gè)范圍的搜索條件,RangeQuery query = new RangeQuery(begin, end, included);
    最后一個(gè)boolean值表示是否包含邊界條件本身, 用字符表示為"[begin TO end]" 或者"{begin TO end}"
    PrefixQuery
    顧名思義,就是表示以某某開(kāi)頭的查詢, 字符表示為"something*"
    BooleanQuery
    這個(gè)是一個(gè)組合的Query,你可以把各種Query添加進(jìn)去并標(biāo)明他們的邏輯關(guān)系,添加條件用
    public void add(Query query, boolean required, boolean prohibited)
    方法, 后兩個(gè)boolean變量是標(biāo)示AND or NOT三種關(guān)系 字符表示為" AND or NOT" 或 "+ -" ,一個(gè)BooleanQuery中可以添加多個(gè)Query, 如果超過(guò)setMaxClauseCount(int)的值(默認(rèn)1024個(gè))的話,會(huì)拋出TooManyClauses錯(cuò)誤.
    PhraseQuery
    表示不嚴(yán)格語(yǔ)句的查詢,比如"red pig"要匹配"red fat pig","red fat big pig"等,PhraseQuery所以提供了一個(gè)setSlop()參數(shù),在查詢中,lucene會(huì)嘗試調(diào)整單詞的距離和位置,這個(gè)參數(shù)表示可以接受調(diào)整次數(shù)限制,如果實(shí)際的內(nèi)容可以在這么多步內(nèi)調(diào)整為完全匹配,那么就被視為匹配.在默認(rèn)情況下slop的值是0, 所以默認(rèn)是不支持非嚴(yán)格匹配的, 通過(guò)設(shè)置slop參數(shù)(比如"red pig"匹配"red fat pig"就需要1個(gè)slop來(lái)把pig后移動(dòng)1位),我們可以讓lucene來(lái)模糊查詢. 值得注意的是,PhraseQuery不保證前后單詞的次序,在上面的例子中,"pig red"需要2個(gè)slop,也就是如果slop如果大于等于2,那么"pig red"也會(huì)被認(rèn)為是匹配的.
    WildcardQuery
    使用?和*來(lái)表示一個(gè)或多個(gè)字母比如wil*可以匹配 wild ,wila ,wilxaaaa...,值得注意的是,在wildcard中,只要是匹配上的紀(jì)錄,他們的相關(guān)度都是一樣的,比如wilxaaaa和wild的對(duì)于wil*的相關(guān)度就是一樣的.
    FuzzyQuery
    這個(gè)Query對(duì)中文沒(méi)有什么用處,他能模糊匹配英文單詞(前面的都是詞組),比如fuzzy和wuzzy他們可以看成類似, 對(duì)于英文的各種時(shí)態(tài)變化和復(fù)數(shù)形式,這個(gè)FuzzyQuery還算有用,匹配結(jié)果的相關(guān)度是不一樣的.字符表示為 "fuzzy~"
    三:QueryParser使用
    對(duì)于搜索引擎, 很多情況下用戶只需要一個(gè)輸入框就要輸入所有的查詢條件(比如google), 這時(shí),QueryParser就派上用場(chǎng)了,他的作用就是把各種用戶輸入轉(zhuǎn)為Query或者Query組, 他把上面提到的Query的字符表示(Query.toString)轉(zhuǎn)化為實(shí)際的Query對(duì)象,比如"wuzzy~"就會(huì)轉(zhuǎn)換為FuzzyQuery, 不過(guò)QueryParser用到了Analyzer,所以QueryParser parse過(guò)后的Query再toString未必和原來(lái)的一樣.Query額外的語(yǔ)法有:
    分組:Groupping
    比如"(a AND b) or C",就是括號(hào)分組,很容易理解
    FieldSelectiong
    QueryParser的查詢條件是對(duì)默認(rèn)的Field進(jìn)行的, 它在QueryParser解析的時(shí)候編碼指定, 如果用戶需要在查詢條件中選用另外的Field, 可以使用如下語(yǔ)法: fieldname:fielda, 如果是多個(gè)分組,可以用fieldname:(fielda fieldb fieldc)表示.
    *號(hào)問(wèn)題
    QueryParse默認(rèn)不允許*號(hào)出現(xiàn)在開(kāi)始部分,這樣做的目的主要是為了防止用戶誤輸入*來(lái)頭導(dǎo)致嚴(yán)重的性能問(wèn)題(會(huì)把所有記錄讀出)
    boosting
    通過(guò)hello^2.0 可以對(duì)hello這個(gè)term進(jìn)行boosting,(我想不到什么用戶會(huì)這樣么bt)
    QueryParser是一個(gè)準(zhǔn)備好的,立即可以工作的幫助類,不過(guò)他還是提供了很多參數(shù)供程序員調(diào)整,首先,我們需要自己構(gòu)造一個(gè)新的QueryParser,然后對(duì)他的各種參數(shù)來(lái)定制化
    posted on 2008-10-07 11:16 梓楓 閱讀(1183) 評(píng)論(0)  編輯  收藏 所屬分類: lucene

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 999久久久免费精品播放| 亚洲AV无码专区国产乱码4SE| 久久国产免费观看精品3| 免费人成网上在线观看| 亚洲AV综合色区无码二区偷拍| 亚洲熟女少妇一区二区| 国产人妖ts在线观看免费视频| 亚洲啪啪免费视频| 久久久久成人片免费观看蜜芽 | 成人性生交大片免费看好| 精品久久久久久亚洲综合网| ass亚洲**毛茸茸pics| 亚洲日韩区在线电影| 国产亚洲高清不卡在线观看| 亚洲av午夜成人片精品电影| 狠狠久久永久免费观看| 久久99九九国产免费看小说| 在线看无码的免费网站| 麻豆精品成人免费国产片| 中国黄色免费网站| 久久国产乱子伦精品免费午夜| 免费福利在线观看| 美女黄频a美女大全免费皮| 亚洲国产精品无码久久九九大片| 亚洲中文字幕无码中文字| 亚洲香蕉久久一区二区| 亚洲午夜精品国产电影在线观看| 亚洲精品国产肉丝袜久久| 久久久久久亚洲精品成人| 久久久久久a亚洲欧洲AV| 亚洲av日韩av高潮潮喷无码| 亚洲AV无码乱码在线观看裸奔| 亚洲AV无码欧洲AV无码网站| 亚洲av无码成h人动漫无遮挡| 久久91亚洲精品中文字幕| 亚洲国产成人私人影院| 亚洲黄色在线视频| 亚洲成人动漫在线观看| 亚洲中文字幕久在线| 亚洲第一男人天堂| 国产成人亚洲午夜电影|