W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
Solr 的標準查詢解析器(Query Parser)也被稱為 “l(fā)ucene” 解析器。
標準查詢解析器的關鍵優(yōu)勢在于它支持強大且相當直觀的語法,允許您創(chuàng)建各種結構化查詢。最大的缺點是它不容忍出現(xiàn)語法錯誤,與 DisMax 查詢解析器相比, DisMax 查詢解析器的設計目的是盡可能地減少拋出錯誤。
除了常見 Query 參數(shù),F(xiàn)aceting 參數(shù),Highlighting 顯示參數(shù)之外,標準查詢解析器還支持下列所述的參數(shù)。
使用標準查詢語法定義查詢。該參數(shù)是強制性的。
指定查詢表達式的默認運算符,覆蓋在 Schema 中指定的默認運算符??赡艿闹凳恰癆ND”或“OR”。
指定默認字段,覆蓋架構中默認字段的定義。
拆分空白。如果設置為true
,則對每個單獨的空格分隔的術語分別調用文本分析。默認是false
;空格分隔的術語序列將一次性提供給文本分析,使分析過濾器在術語序列上操作的適當功能,例如多詞同義詞和帶狀皰疹。
默認參數(shù)值是在 solrconfig 中指定的,也可由請求中的查詢時間值重寫。
默認情況下,來自標準查詢解析器的響應包含一個 <result> 塊,這個塊是未命名的。如果使用該 debug 參數(shù),則將使用 "debug" 名稱返回一個附加的 <lst> 塊。這將包含有用的調試信息,包括原始查詢字符串、解析的查詢字符串以及 <result> 塊中每個文檔的解釋信息。如果 explainOther 參數(shù)也被使用,那么將為所有匹配該查詢的文檔提供額外的解釋信息。
本節(jié)介紹標準查詢解析器的響應示例。
下面的 URL 提交一個簡單的查詢,并請求 XML Response Writer 使用縮進來使 XML 響應更具可讀性。
http://localhost:8983/solr/techproducts/select?q=id:SP2514N
結果如下:
<response>
<responseHeader><status>0</status><QTime>1</QTime></responseHeader>
<result numFound="1" start="0">
<doc>
<arr name="cat"><str>electronics</str><str>hard drive</str></arr>
<arr name="features"><str>7200RPM, 8MB cache, IDE Ultra ATA-133</str>
<str>NoiseGuard, SilentSeek technology, Fluid Dynamic Bearing (FDB) motor</str></arr>
<str name="id">SP2514N</str>
<bool name="inStock">true</bool>
<str name="manu">Samsung Electronics Co. Ltd.</str>
<str name="name">Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133</str>
<int name="popularity">6</int>
<float name="price">92.0</float>
<str name="sku">SP2514N</str>
</doc>
</result>
</response>
這里是一個有限的字段列表查詢的例子。
http://localhost:8983/solr/techproducts/select?q=id:SP2514N&fl=id+name
結果如下:
<response>
<responseHeader><status>0</status><QTime>2</QTime></responseHeader>
<result numFound="1" start="0">
<doc>
<str name="id">SP2514N</str>
<str name="name">Samsung SpinPoint P120 SP2514N - hard drive - 250 GB - ATA-133</str>
</doc>
</result>
</response>
對標準查詢解析器的查詢被分解為術語和運算符。有兩種類型的術語:單個術語和短語。
可以將多個術語與布爾運算符組合在一起,形成更復雜的查詢(如下所述)。
重要的是,用于查詢的解析器分析術語和短語的方式與用于索引分析術語和短語的分析器的方式一致;否則,搜索可能會產(chǎn)生意想不到的結果。
Solr 支持各種術語修飾符,根據(jù)需要為搜索添加靈活性或精確性。這些修飾符包括通配符,用于進行搜索的字符 “fuzzy” 或更一般化,等等。以下各節(jié)詳細介紹了這些修飾符。
Solr 的標準查詢解析器支持單個和多個字符通配符搜索。通配符可以應用于單項,但不能搜索短語。
通配符搜索類型 | 特殊字符 | 示例 |
---|---|---|
單個字符(匹配單個字符) |
? |
搜索字符串 |
多個字符(匹配零個或多個連續(xù)字符) |
* |
通配符搜索: |
Solr 的標準查詢解析器支持基于 Damerau-Levenshtein Distance 或 Edit Distance 算法的模糊搜索。模糊搜索發(fā)現(xiàn)與指定術語相似的術語,而不一定完全匹配。要進行模糊搜索,請在單詞詞尾添加波浪號 ? 符號。例如,要搜索與 “roam” 拼寫相似的術語,請使用模糊搜索:
roam~
這個搜索將匹配像 roams、foam、foams。它也將匹配“roam”這個詞本身。
可選的距離參數(shù)指定允許編輯的最大數(shù)量,介于0和2之間,默認為2。例如:
roam~1
這將匹配 roams 和 foam 等術語,但不包括 foams,因為它的編輯距離為“2”。
在許多情況下,詞干 (將術語減少到一個公共詞干) 會對模糊搜索和通配符搜索產(chǎn)生類似的效果。
鄰近搜索查找介于特定距離之間的術語。
如果要執(zhí)行鄰近搜索,請在搜索短語的末尾添加波浪號字符 ? 和數(shù)字值。例如,要在文檔中搜索彼此相隔10個字的 “apache” 和 “jakarta”,請使用以下搜索:
"jakarta apache"~10
這里所指的距離是匹配指定詞組所需的術語移動次數(shù)。在上面的例子中,如果 “apache” 和 “jakarta” 在一個字段中相隔10個空格,而 “apache” 在 “jakarta” 之前出現(xiàn),則需要10個以上的術語來移動這些術語并將 “apache” 定位在 "jakarta" 的右邊,并在兩者之間有一個空間。
范圍搜索指定字段的值范圍(具有上限和下限的范圍)。該查詢與指定字段或字段的值位于該范圍內的文檔匹配。范圍查詢可以包含或不包括上限和下限。排序按字典順序完成,數(shù)字字段除外。例如,下面的范圍查詢匹配其 popularity 字段的值在52和10000之間(包含)的所有文檔:
popularity:[52 TO 10000]
范圍查詢不限于日期字段,甚至還包括數(shù)字字段。您也可以使用非日期字段的范圍查詢:
title:{Aida TO Carmen}
這將查找所有標題介于 Aida 和 Carmen 之間的文件,但不包括 Aida 和 Carmen 的文件。
查詢周圍的括號決定了它的包容性。
count:{1 TO 10]
Lucene / Solr 根據(jù)找到的術語提供匹配文檔的相關級別。要增加一個術語:^,請在搜索的術語末尾使用帶有一個 boost 因子 (一個數(shù)字)的插入符號 ^。boost 因子越高,該術語的相關性越高。
增強功能使您可以通過增加文檔的術語來控制文檔的相關性。例如,如果您正在尋找 “jakarta apache”,您希望術語“jakarta”更相關,您可以通過在該術語后立即加上^ 符號和 boost 因子來提高它。例如,你可以輸入:
jakarta^4 apache
這將使與 jakarta 一詞的文件顯得更相關。您還可以像在示例中那樣增加短語術語:
"jakarta apache"^4 "Apache Lucene"
默認情況下,boost 因子為1。盡管 boost 因子必須為正值,但可小于1(例如,可能為0.2)。
常量 score 查詢是使用 <query_clause>^=<score> 創(chuàng)建的,它將整個子句設置為與該子句匹配的任何文檔的指定分數(shù)。如果您只關心特定條款的匹配,而不希望其他相關因素,例如術語頻率(該術語在該字段中出現(xiàn)的次數(shù))或相反的文檔頻率(一項衡量整個指數(shù)中一個術語在一個領域的罕見程度的指標)。
例如:
(description:blue OR color:blue)^=1.0 text:shoes
在 Solr 中索引的數(shù)據(jù)是在 Solr Schema 中定義的字段中組織的。搜索可以利用字段來為查詢增加精度。例如,您只能在特定字段(如標題字段)中搜索術語。
架構將一個字段定義為默認字段。如果您在查詢中未指定字段,則 Solr 僅搜索默認字段。或者,您可以在查詢中指定不同的字段或字段的組合。
要指定一個字段,請輸入字段名稱,后跟一個冒號“:”,然后在該字段內搜索該術語。
例如,假設索引包含兩個字段,即標題和文本,并且該文本是默認字段。如果您想找到一個名為“The Right Way”,其中包含文本“don’t go this way”,您可以在您的搜索查詢中包括以下任一項:
title:"The Right Way" AND text:go
title:"Do it right" AND go
由于文本是默認字段,所以不需要字段指示符;因此上面的第二個查詢省略了它。
該字段僅對它直接位于其前面的術語有效,因此查詢 title:Do it right 將在標題字段中僅找到 “Do”。它會在默認字段(在這里是文本字段)中找到 “it” 和 “right”。
布爾運算符允許您將布爾邏輯應用于查詢,要求在字段中存在或不存在特定的術語或條件以匹配文檔。下表總結了標準查詢解析器支持的布爾運算符。
布爾運算符 | 替代符號 | 描述 |
---|---|---|
AND |
|
要求布爾運算符兩邊的條件都存在以進行匹配。 |
NOT |
|
要求下列術語不存在。 |
OR |
|
要求兩個術語 (或兩個術語) 都存在于匹配項中。
|
|
要求提供以下術語。
|
|
|
禁止以下術語(即,不包含該術語的字段或文檔上的匹配項)。該 |
布爾運算符允許通過邏輯運算符來組合術語。Lucene 支持 AND、“+”、OR、NOT 和“ - ”作為布爾運算符。
注意:使用 AND 或 NOT 等關鍵字指定布爾運算符時,關鍵字必須全部大寫;標準查詢解析器可以支持上表中列出的所有布爾運算符,DisMax 查詢解析器僅支持+
和-
。
OR 運算符是默認的連接運算符。這意味著,如果兩個術語之間沒有布爾運算符,則使用 OR 運算符。OR 運算符鏈接兩個術語,如果文檔中的任一術語存在,則查找匹配的文檔。這等效于使用集的聯(lián)合。符號 || 可以用來代替單詞 OR。
要搜索包含 "jakarta apache" 或只是 "jakarta" 的文檔,請使用以下查詢:
"jakarta apache" jakarta
或者:
"jakarta apache" OR jakarta
該 + 符號(也稱為“required”運算符)要求在至少一個文檔中的某個字段中的 "+" 符號之后的術語存在,以便查詢返回匹配。
例如,要搜索必須包含 “jakarta” 且可能包含 “l(fā)ucene” 的文檔,請使用以下查詢:
+jakarta lucene
標準查詢解析器和DisMax查詢解析器都支持此運算符。
AND 運算符匹配單個文檔的文本中任何地方存在兩個詞的文檔。這相當于使用集合的交集。符號 && 可以用來代替單詞 AND。
要搜索包含 “jakarta apache” 和 “Apache Lucene” 的文檔,請使用以下任一查詢:
"jakarta apache" AND "Apache Lucene"
"jakarta apache" && "Apache Lucene"
NOT 運算符排除在 NOT 之后包含該術語的文檔。這相當于使用集合的差異。符號 ! 可以用來代替單詞 NOT。
以下查詢搜索包含短語 “jakarta apache” 但不包含短語 “Apache Lucene” 的文檔:
"jakarta apache" NOT "Apache Lucene"
"jakarta apache" ! "Apache Lucene"
該 - 符號或 “prohibit” 操作符排除包含 - 符號后的術語的文檔。
例如,要搜索包含 “jakarta apache” 而不是 “Apache Lucene” 的文檔,請使用以下查詢:
"jakarta apache" -"Apache Lucene"
在查詢中出現(xiàn)以下字符時,Solr 提供了特殊的含義:
+ - && || ! ( ) { } [ ] ^ " ~ * ? : /
為了使 Solr 逐字地解釋這些字符中的任何一個,而不是像特殊字符一樣,在字符前面加一個反斜杠字符 \。例如,要搜索(1 + 1):2 而不用 Solr 將加號和括號解釋為用兩個術語來表述子的特殊字符,請在每個字符前面加上反斜杠來轉義字符:
\(1\+1\)\:2
Lucene / Solr 支持使用括號將子句分組以形成子查詢。如果要控制查詢的布爾邏輯,這可能非常有用。
下面的查詢搜索“jakarta”或“apache”和“website”:
(jakarta OR apache) AND website
這增加了查詢的精確度,要求使用術語“website”以及術語“jakarta”和“apache”。
要將兩個或多個布爾運算符應用于搜索中的單個字段,請將括號中的布爾子句分組。例如,下面的查詢搜索一個包含單詞 “return” 和短語 “pink panther”的標題字段:
title:(+return +"pink panther")
查詢字符串支持 C 語言風格的注釋。
例如:
"jakarta apache" /* this is a comment in the middle of a normal query string */ OR jakarta
評論可以嵌套。
val:myfield
val:"recip(rord(myfield),1,2,3)"
inStock:true OR {!dismax qf='name manu' v='ipod'}
q=features:songs OR filter(inStock:true)
q=+manu:Apple +filter(inStock:true)
q=+manu:Apple & fq=inStock:true
這甚至可以用來緩存復雜過濾器查詢的單個子句。在下面的第一個查詢中,將3個項目添加到過濾器緩存(頂級 fq 和兩個 filter(…?) 子句)中,在第二個查詢中,將有2個緩存命中和一個新的緩存插入(用于新的頂級 fq):
q=features:songs & fq=+filter(inStock:true) +filter(price:[* TO 100])
q=manu:Apple & fq=-filter(inStock:true) -filter(price:[* TO 100])
q=(description:blue color:blue)^=1.0 title:blue^=5.0
基于日期的字段查詢必須使用適當?shù)娜掌诟袷?。對于確切日期值的查詢將需要引用或轉義,因為是用于表示字段查詢的解析器語法:
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: