Solr搜索解析及查詢解析器用法概述

一.簡介

  大多數查詢都使用 了標準的Solr語法。這種語法是Solr最常見的,由默認查詢解析器負責處理。Solr的默認查詢解析器是Lucene查詢解析器【LuceneQParserPlugin類實現】。Lucene查詢解析器全面支持Lucene語法及Solr的一些專用擴展。

二.Lucene查詢解析器語法

  1.字段搜索

    在Solr索引中搜索一個值時,一般來說是在特定字段上進行查找。字段搜索語法是:字段名稱+‘:’+搜索內容,舉例如下:

    

    title:solr 或 title:"apache solr" request_content_split:(流程 問題) 備注:括號表示集合,用空格隔開每個元素,默認表示OR的含義

    盡管關鍵詞搜索不明確指定字段的做法很常見,大需要注意的是,一般在定義的默認字段上進行關鍵詞搜索。舉例來說,如果content定義為默認字段【df=content】,則以下兩個查詢是等價的:

    solr 或 content:solr

    還需要注意的是,字段和冒號后面的表達式范圍必須明確定義。以下兩個查詢是等價的【假設df=content】,不過在第一個查詢中用戶可能存在其他意圖。

    title:apache solr 或 title:apache content:solr

    如果在同一個字段中搜索多個詞項,使用組合表達式,在字段搜索中指定詞項的范圍:

    title:(apache solr)

    如果嘗試短語搜索,使用引號【而不是括號】來定義短語范圍,盡管這樣會導致查詢要求短語的所有詞項必須同時出現。

    title:"apache solr"

  2.必備詞項【使用較少】

    為指定一個或多個詞項必須出現,使用一元運算符+來連接詞項。除非文檔包含指定的詞項,否則不予匹配。如果匹配的文檔必須包含多個詞項,使用二元運算符AND或&&,否則對每個詞項都使用一元運算符+。

    

 

    如果默認運算符是AND,在沒有指定其他運算符的情況下,每個詞項都要求必備。由于每增加一個必備詞項都會進一步限制文檔集中的結果總數,因此通過使用多個必備詞項可以加快查詢速度,從而進一步優化結果數量。

  3.可選詞項

    相比限制必備字段的做法,擴大匹配的文檔數量則適用于另外一些情況。默認運算符是OR,除非有其他指定,否則每個表達式都是可選的。同樣地,多個表達式之間使用二元運算符OR或||,這表示匹配的文檔中至少包含其中一個詞項。

    

    值得注意的是,可選詞項越多會導致匹配文檔集越大,OR運算比其它布爾運算的執行成本更高。對于關鍵詞搜索,如果內容數量有限,而且希望以犧牲查準率為代價,確保能夠返回一些結果【更高的查全率】,那么會考慮使用OR作為默認運算符。由于多個可選詞項的文檔匹配通常會導致較高的相關度得分,使用OR作為默認運算符并根據相關度得分排名的話,仍然有可能獲得搜索結果中最相關的那部分結果。不過,與要求匹配所有關鍵詞不同的是,擴展查詢會得到更多一些奇怪的匹配結果。

  4.短語搜索【使用較少,且必須使用在使用了分詞器的字段上】

    如果想要匹配彼此相鄰的多個詞項,使用引號把它們括起來視為一個短語。此查詢表達式不能保證匹配出完全一樣的文本,被搜索字段可能包含對短語中詞項進行修改的分析器。最合理的特定短語搜索不應該匹配無關的短語。短語搜索適用于內容中特定字段和多詞名稱的處理。

  5.組合表達式【常用】

    為處理任意復雜的布爾子句,Solr使用括號將查詢表達式組合在一起。

    

    組合表達式可以設置表達式的上下文,例如,指明在同一個字段中搜索多個單詞。組合表達式可以任意嵌套。

  6.詞項鄰近度

    短語搜索是詞項相似度搜索的簡化版本。通過添加波浪線和詞項位置距離數搜索位置相近的詞項,不一定是相鄰的。

    

    短語搜索是詞項位置距離為0的鄰近搜索。

    

    詞項距離為3表示查詢兩詞之間詞項距離<=3的搜索,兩詞項交換位置相當于移動了兩個詞項位置。

    指定足夠大的有效鄰近值,可以匹配出文檔中任意位置的詞項,這與AND查詢效果類似。詞項鄰近度查詢還有一個副作用,在文檔中詞項越靠近,該鄰接查詢對應的相關度得分就越高。與組合查詢相比,當詞項距離較大時,使用鄰近詞搜索花費成本更高。

  7.字符鄰近

    不僅可以在詞項之間進行鄰近搜索,還可以對詞項中的字符進行基于編輯距離的搜索,找到拼寫相似的詞項。字符鄰近搜索的語法與詞項鄰近搜索類似,由于字符鄰近搜索處理的是一個詞項,因此不帶引號。

    

    1表示與搜索詞項最多有一個字符的差距,包括多一個字符,少一個字符和一個字符不一樣三種情況。

  8.排除詞項

    有時我們需要從查詢中明確排除特定詞項。在表達式上使用一元運算符-【減號】或在表達式之間使用NOT布爾運算符來排除詞項。

    

    或

    

  9.區間搜索【方括號為閉區間,花括號為開區間】

    有時候我們不希望查詢表達式只匹配出一個值,而是匹配出值的整個區間。區間可以是數值區間、日期區間或字符串區間。區間搜索能夠找到指定的一組值,其語法為字段名加冒號再加一個方括號。

    

    如果沒有指定區間的最大值和最小值,則需要對開區間的上限和下線使用通配符*

    

  10.通配符搜索

    有些情況下用戶需要對Solr索引中單詞或短語的變體進行匹配。對于用戶輸入的大多數關鍵詞而言,詞干提取這類技術讓通配符搜索變得沒那么重要了,然而對于查找以特定字符集開頭的文檔或替代單個字符的操作,通配符搜索還是還有用武之地的。

    

  11.權重表達式

    如果表達式后面指定了一個插入號【^】,無論是詞項、短語還是組合表達式,都可以調整相關度權重。

    

 

  12.特殊字符轉義【分詞器字段除外】

    Solr中有些字符是保留字符,也就是說,它們被當做查詢語法進行解析,而不是作為搜索詞項。包括:

    

 

    如果要搜索保留字符,必須將保留字符用引號括起來,或者使用反斜杠對其進行轉義。關鍵詞中處理保留字符的推薦做法是在傳入Solr之前去除沒有搜索價值的保留字符,或者對它們依次使用反斜杠進行轉義。

    

 

    當搜索字段為分詞器字段時,保留字符會被分詞過濾掉,因此搜索時不加保留字符也可以搜索到!

    

posted @ 2020-02-22 17:35  云山之巔  閱讀(...)  評論(...編輯  收藏
内部期期公开一波中特