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

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

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

    Terry.Li-彬

    虛其心,可解天下之問;專其心,可治天下之學;靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      143 隨筆 :: 344 文章 :: 130 評論 :: 0 Trackbacks
    Lucene提供了豐富的API來組合定制你所需要的查詢器,同時也可以利用 Query Parser提供的強大的查詢語法解析來構(gòu)造你想要的查詢器。本文章詳細的介紹了Lucene的查詢語法。通過Java語法分析器把一個查詢字符串解析成 Lucene的查詢器。在你選擇使用Query Parser前,請考慮以下事項:

    如果你打算在程序中拼接查詢語法串然后再利用 Query Parser轉(zhuǎn)換,那么強烈建議你利用相應(yīng)的API來自己構(gòu)造查詢器。也就是說,Query Parser是為手工輸入高級查詢設(shè)計的,而不是為程序拼接語法串而設(shè)計的。不分詞的字段也最好通過相應(yīng)的API添加到查詢器中,而不是通過Query Parser。Query Parser 使用的Analyser分析器,作用是將用戶手工輸入的文本轉(zhuǎn)化為相應(yīng)的Term。如果一個字段的值是通過程序生成的(例如日期字段,關(guān)鍵詞字段等),那 么在查詢的時候也應(yīng)該保持前后一致,利用程序生成相應(yīng)的格式來查詢。

    在查詢的目標中,如果字段全部是程序生成的文本,(例如補齊的日期字 段等),最好使用Query Parser以便查詢的時候也是一致的格式。至于其它的,例如日期范圍查詢,關(guān)鍵字查詢等,最好調(diào)用相應(yīng)的API來構(gòu)建查詢器。目標字段中如果僅僅擁有有 限的枚舉值時,最好通過下拉列表提供給用戶選擇,然后利用TermQuery添加到查詢器中,而不是而其拼接到查詢字符串然后利用Query Parser來解析。

    Terms
    一個查詢將分解為若干Term以及操作符,有兩種 Term,其一是單一Term,其二為短語。單一Term是經(jīng)過分析器分詞后的最小單元,他就是一個簡單的詞,例如“Test”和“Hello”。短語則 是一組被雙引號括起來的一組詞,例如:“Hello dolly”,多個Term可以通過布爾操作合并在一個更加復雜的查詢器中。
    注意:一般來說,創(chuàng)建索引的分析器和查詢的分析器最好保持一致(當然也有特殊情況,比如單字索引,分詞組合查詢),所以選擇一個不會干擾查詢詞的分析器是很重要的。

    Fields
    Lucene 支持多字段數(shù)據(jù),當你在查詢的時候你可以指定一個字段查詢,也可以使用默認的字段。你可以使用 字段名 + “:” + 查詢詞來指定字段名搜索。舉個例子,讓我們假定Lucene的索引中含有兩個字段,Title字段和Text字段,其中Text字段是默認字段,當你想找 到一篇文檔其中標題包含“The Right Way”同時文本中包含“go”,你可以輸入:
    title:"The Right Way" AND text:go
    或者:
    title:" The Right Way " AND go
    如果字段是默認字段的話,在查詢語法中可以不需要顯式指定。注意,使用默認字段有可能會造成如下的結(jié)果:
    title:Do it right
    以上查詢將查找標題中含有“Do”,Text字段字段中含有“it”和“right”的文檔,因為Text是默認字段,所以如果想要查找Title中完整包含的很用引號引起來。

    Term Modifiers
    Lucene支持在Term中使用通配符來支持模糊查詢。

    Wildcard Searches
    Lucene支持單個或者多個字符的通配符查詢,匹配單一字符使用符號“?”,匹配多個字符使用符號“*”。
    “?”通配符將查找所有滿足通過一個字符替換后符合條件的文檔。比如:搜索“test”和“text”你可以使用:
    te?t
    “*”通配符將查詢0個或者多個字符替換后符合條件的。舉例來說,查詢test,tests或者tester,你可以使用一下字符串來搜索:
    test*
    當然,你也可以將“*”放在字符的中間
    te*t
    注意:你不能將“*”和“?”放在第一個字符來查詢。(Lucene應(yīng)該是出于性能考慮,所以不支持該功能)

    Fuzzy Searches
    Lucene支持基于編輯距離算法的模糊搜索,你可以使用波浪符號“~”放在查詢詞的后面,比如搜索一個與“roam”拼寫相近的詞可以使用:
    roam~
    該查詢將尋找類似“foam”和“roams”等的詞語。也可以說是相似度查詢。

    Proximity Searches
    Lucene支持指定距離查詢,你可以使用波浪號“~”加數(shù)字在查詢詞后。舉例來說搜索“apache”和“jakarta”距離10個字符以內(nèi),你可以使用如下語法:
    "jakarta apache"~10
    通過這個語法支持,我們可以單字索引,分詞查詢,分詞完后,滿足每個詞的單字必須間距為0。這樣可以保證100%的召回率,但是在索引方面將造成索引臃腫,同時查詢速度也將在某程度上降低,一般來說,在150W文章數(shù)據(jù)到200W數(shù)據(jù)的時候性能將會明顯的降低。

    Range Searches
    范圍查詢允許你指定某個字段最大值和最小值,查詢在二者之間的所有文檔。范圍查詢可以包含或者不包含最大值和最小值,排序是按照字典順序來排序的。
    mod_date:[20020101 TO 20030101]
    這個將查找滿足mode_date字段在大于等于20020101,小于等于20030101范圍的所有文檔,注意:范圍查詢并不是為日期字段專設(shè)的,你也可以對非日期字段進行范圍查詢。
    title:{Aida TO Carmen}
    這個將查找所有標題在Aida和Carmen之間但不包含Aida和Carmen的文檔。包含最大值和最小值的查詢使用方括號,排除則使用花括號。

    Boosting a Term
    Lucene支持給不同的查詢詞設(shè)置不同的權(quán)重。設(shè)置權(quán)重使用“^”符號,將“^”放于查詢詞的尾部,同時跟上權(quán)重值,權(quán)重因子越大,該詞越重要。設(shè)置權(quán)重允許你通過給不同的查詢詞設(shè)置不同的權(quán)重來影響文檔的相關(guān)性,假如你在搜索:
    jakarta apache
    如果你認為“jakarta”在查詢時中更加重要,你可以使用如下語法:
    jakarta^4 apache
    這將使含有Jakarta的文檔具有更高的相關(guān)性,同樣你也可以給短語設(shè)置權(quán)重如下:
    "jakarta apache"^4 "jakarta lucene"
    在默認情況下,權(quán)重因子為1,當然權(quán)重因子也可以小于1。

    Boolean operators
    布爾操作符可以將多個Term合并為一個復雜的邏輯查詢。Lucene支持AND,
    +,OR,NOT, -作為操作符號。注意,所有的符號必須為大寫。

    OR
    OR 操作符默認的連接操作符。這意味著,當沒有給多個Term顯式指定操作符時,將使用OR,只要其中一個Term含有,則可以查詢出文檔,這跟邏輯符號|| 的意思相似。假設(shè)我們查詢一個文檔含有“jakarta apache”或者“jakarta”時,我們可以使用如下語法:
    "jakarta apache" jakarta
    或者
    "jakarta apache" OR jakarta

    AND
    AND操作符規(guī)定必須所有的Term都出現(xiàn)才能滿足查詢條件,這跟邏輯符號&&意思相似。如果我們要搜索一個文檔中同時含有“jakarta apache”和“jakarta lucene”,我們可以使用如下語法:
    ?? "jakarta apache" AND "jakarta lucene"

    +
    +操作符規(guī)定在其后的Term必須出現(xiàn)在文檔中,也就是查詢詞中的MUST屬性。舉個例子來說,當我們要查詢一個文檔必須包含“jakarta”,同時可以包含也可以不包含“l(fā)ucene”時,我們可以使用如下語法:
    +jakarta apache

    NOT
    NOT操作符規(guī)定查詢的文檔必須不包含NOT之后的Term,這跟邏輯符號中的!相似。當我們要搜索一篇文檔中必須含有“jakarta apache”同時不能含有“Jakarta lucene”時,我們可以使用如下查詢;
    "jakarta apache" NOT "jakarta lucene"
    注意:NOT操作符不能使用在單獨Term中,舉例來說,以下查詢將返回無結(jié)果:
    NOT "jakarta apache"

    -
    -操作符排除了包含其后Term的文檔,跟NOT有點類似,假設(shè)我們要搜索“Jakarta apache”但不包含“Jakarta lucene”時,我們使用如下語法:
    "jakarta apache" -"jakarta lucene"

    Grouping
    Lucene支持使用圓括號來將查詢表達式分組,這將在控制布爾控制查詢中非常有用。舉例來說:當搜索必須含有“website”,另外必須含有“jakarta”和“apache”之一,我們可以用如下語法:
    (jakarta OR apache) AND website
    這種語法對消除歧義,確保查詢表達式的正確性具有很大的意義。

    Field Grouping
    Lucene支持對字段用圓括號來進行分組,當我們要查詢標題中含有“return”和“pink ranther”時,我們可以使用如下語法:
    title:(+return +"pink panther")

    Escaping Special Characters
    Lucene支持轉(zhuǎn)義查詢中的特殊字符,以下是Lucene的特殊字符清單:
    + - && || ! ( ) { } [ ] ^ " ~ * ? : \
    轉(zhuǎn)義特殊字符我們可以使用符號“\”放于字符之前。比如我們要搜索(1+1):2,我們可以使用如下語法:
    \(1\+1\)\:2
    posted on 2010-09-21 10:09 禮物 閱讀(884) 評論(1)  編輯  收藏

    評論

    # re: Lucene Syntax (lucene查詢語法詳解)(轉(zhuǎn)) 2012-04-16 17:16 guest
    僅僅是翻譯而已  回復  更多評論
      


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

    網(wǎng)站導航:
     
    主站蜘蛛池模板: 黄色网址免费在线观看| 亚洲伊人成无码综合网| 久久久免费的精品| 精品特级一级毛片免费观看| 亚洲电影在线播放| 亚洲免费人成在线视频观看| 免费国产综合视频在线看| 99热在线精品免费全部my| 99久9在线|免费| 搡女人免费免费视频观看| 一级毛片免费播放试看60分钟| 亚洲男同gay片| 好紧我太爽了视频免费国产 | 一本岛v免费不卡一二三区| 最新亚洲精品国偷自产在线| 亚洲欧洲自拍拍偷综合| 亚洲另类激情综合偷自拍| 中文字幕免费在线观看| a毛片全部免费播放| 色爽黄1000部免费软件下载| 亚洲电影一区二区| 亚洲女初尝黑人巨高清| 自拍偷自拍亚洲精品被多人伦好爽| 亚洲av无码国产精品色在线看不卡 | 久久精品国产亚洲av麻豆小说 | 人妻在线日韩免费视频| 国产黄在线观看免费观看不卡| 日韩成人精品日本亚洲| 亚洲视频在线播放| 亚洲人成网站影音先锋播放| 久久精品国产亚洲av麻| 久久精品亚洲综合专区| 亚洲综合在线视频| 亚洲最大黄色网站| 亚洲女人18毛片水真多| 亚洲人xxx日本人18| 亚洲va无码va在线va天堂| 久久亚洲国产午夜精品理论片| 国产亚洲一区二区精品| 亚洲av日韩av天堂影片精品| 亚洲AV无码1区2区久久|