標準查詢分析器:Solr的默認查詢解析器也稱爲“Lucene”解析器。
標準查詢解析器的主要優點是,它支持一種健壯且相當直觀的語法,允許您創建各種結構化查詢。最大的缺點是,與設計爲儘可能少地拋出錯誤的DisMax的查詢解析器相比,它非常不容忍語法錯誤。
- 標準查詢分析器參數
除了常見的查詢參數、分面參數、高亮參數和“更多其他”參數,標準查詢分析器還支持下表中描述的參數。
q 使用標準查詢語法定義查詢。此參數是必需的。
q.op 指定查詢表達式的默認運算符,指定的默認運算符。可能的值爲“AND”或“OR”。
df 指定默認字段,重寫模式中默認字段的定義。
sow
在空白處拆分。如果設置爲true,則對每個單獨的空白分隔詞分別調用文本分析。默認值爲false;一次將爲文本分析提供空格分隔的詞條序列,從而使分析篩選器能夠在詞條序列上正常工作,例如多詞同義詞和名詞複數。
默認參數值可以在solrconfig.xml中指定,也可以在查詢時覆蓋。
- 標準查詢分析器響應
response默認情況下,來自標準查詢解析器的響應包含一個未命名的<result>塊。如果使用了debug參數,那麼將使用“debug”的名稱返回一個附加的<lst>塊。這將包含有用的調試信息,包括原始查詢字符串、解析的查詢字符串以及<result>塊中每個文檔的解釋信息。如果還使用explainOther參數,那麼將爲所有與該查詢匹配的文檔提供附加的explain信息。
本節介紹了來自標準查詢解析器的響應示例。
下面的URL提交一個簡單的查詢,並請求XML響應寫入器使用縮進來提高XML響應的可讀性。
http://localhost:8983/solr/techproducts/select?q=id:SP2514N&wt=xml
返回
<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&wt=xml
返回
<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>
- 指定標準查詢分析器的術語
對標準查詢解析器的查詢被分解爲術語和運算符。有兩種術語:單個術語和短語。
單個術語是一個單詞,例如“test”或“hello”。
短語是由雙引號環繞的一組單詞,如“hello dolly”。
可以將多個術語與布爾運算符組合在一起,以形成更復雜的查詢(如下所述)。
注意:用於查詢的分析器解析術語和短語的方式必須與用於索引的分析器解析術語和短語的方式一致,否則,搜索可能會產生意外的結果。
- 術語修飾符
solr支持各種術語修飾符,可以根據需要增加搜索的靈活性或精度。這些修飾符包括通配符、用於使搜索“模糊”或更通用的字符等。下面的章節詳細描述了這些修改器。
- 通配符搜索
Solr的標準查詢分析器支持在單個術語中進行單字符和多字符通配符搜索。通配符可以應用於單個詞,但不能用於搜索短語。
通配符搜索類型 |
字符 |
Example |
單個字符(與單個字符匹配) |
? |
The search string te?t would match both test and text. |
多個字符(匹配零個或多個連續字符) |
* |
The wildcard search: tes* would match test, testing, and tester. You can also use wildcard characters in the middle of a term. For example: te*t would match test and text. *est would match pest and test. |
- 模糊匹配
Solr的標準查詢解析器支持基於Damerau-Levenshtein距離或編輯距離算法的模糊搜索。模糊搜索發現與指定術語相似的術語,而不必完全匹配。要執行模糊搜索,請在單個單詞詞條末尾使用~符號。例如,要搜索拼寫與“roam”相似的詞,請使用模糊搜索:
roam~
roams, foam, foams
可選距離參數指定允許的最大編輯次數,在0到2之間,默認爲2。例如:
roam~1
roams foam it has an edit distance of "2".not foams
注意:在許多情況下,詞幹(將詞條縮減爲公共詞幹)可以產生類似於模糊搜索和通配符搜索的效果。
- 鄰近搜索
鄰近搜索查找彼此之間在特定距離內的術語。
若要執行鄰近搜索,請將字符~和一個數值添加到搜索短語的末尾。
例如,要在文檔中搜的“apache”和“jakarta”存在10個單詞內距離,請使用以下搜索:
"jakarta apache"~10
這裏所指的距離是匹配指定短語所需的術語移動數。在上面的例子中,如果“apache”和“jakarta”在一個字段中相距10個空格,但“apache”出現在“jakarta”之前,則需要10個以上的術語移動來將術語一起移動,並將“apache”定位到“jakarta”的右側,中間有一個空格。
- 範圍搜索
範圍搜索指定字段的值範圍(具有上界和下界的範圍)。查詢匹配指定字段的值在範圍內的文檔。範圍查詢可以包含或不包含上界和下界。排序是按字典方式完成的,除了數字字段。例如,下面的範圍查詢匹配所有“流行度”字段值介於52和10000(包括52和10000)之間的文檔。
popularity:[52 TO 10000]
範圍查詢不限於日期字段甚至數字字段。還可以將範圍查詢與非日期字段一起使用:
title:{Aida TO Carmen}
這將找到所有標題介於Aida 和Carmen之間的document,但不包括Aida 和Carmen。
查詢周圍的括號決定了它的包容性。
方括號[]表示與值(包括上界和下界)匹配的包含範圍查詢。
大括號{}表示一個排他範圍查詢,該查詢匹配上界和下界之間的值,但不包括上界和下界本身。
您可以混合這些類型,這樣範圍的一端是包含的,另一端是不包含的。舉個例子: count:{1 TO 10]
- Boosting a Term with "^"(增強術語“^”)
Lucene/Solr根據找到的術語提供匹配文檔的相關性級別。要增強術語,請使用插入符號^並在搜索的術語末尾加上增強因子(數字)。增強因子越高,該術語的相關性就越強。
“"jakarta apache ”,你想讓“jakarta”這個詞更具相關性,你可以在這個詞後立即添加^符號和增強因子來增強它。例如,您可以鍵入:
jakarta^4 apache
這將使“jakarta”這一術語的文檔顯得更加相關。您還可以增強短語術語,如示例中所示:
"jakarta apache"^4 "Apache Lucene"
默認情況下,增強因子爲1。儘管增強因子必須爲正,但它可以小於1(例如,它可以爲0.2)。
- “^=”的常量得分
常量分數查詢是用 <query_clause>^=<score>創建的,它將整個子句設置爲匹配該子句的任何文檔的指定分數。如果您只關心某個特定子句的匹配,而不想要其他相關因素,例如術語頻率(術語出現在字段中的次數)或反向文檔頻率(在整個索引中衡量一個字段中的術語有多罕見),這是可取的。
例如 (description:blue OR color:blue)^=1.0 text:shoes
- 指定字段查詢
SOLR中索引的數據按字段組織,這些字段在SOLR模式中定義。搜索可以利用字段爲查詢添加精度。例如,只能在特定字段(如標題字段)中搜索術語。
模式將一個字段定義爲默認字段。如果不在查詢中指定字段,SOLR只搜索默認字段。或者,可以在查詢中指定其他字段或字段組合。
若要指定字段,請鍵入字段名,後跟冒號“:”,然後鍵入要在字段中搜索的術語。
例如,假設一個索引包含兩個字段,即標題title和文本text,而該文本text是默認字段。如果要查找一個名爲“The Right Way”的文檔,其中包含文本“don’t go this way,”,則可以在搜索查詢中包含以下任一術語:
title:"The Right Way" AND text:go
title:"Do it right" AND go
由於文本text是默認字段,因此不需要字段指示符;因此上面的第二個查詢省略了它。
該字段僅對其直接前面的術語有效,因此查詢標題:Do It Right將在標題字段中僅找到“Do”。它將在默認字段中找到“it”和“right”(在本例中是文本字段)。
- 標準查詢分析器支持的布爾運算符
布爾運算符允許您將布爾邏輯應用於查詢,要求字段中存在或不存在特定的條款或條件,以便與文檔匹配。下表總結了標準查詢分析器支持的布爾運算符。
布爾運算 |
替代符合 |
描述 |
AND |
&& |
要求布爾運算符兩側的兩個術語都存在以進行匹配。 |
NOT |
! |
要求以下術語不存在。 |
OR |
|| |
要求一個匹配項存在一個術語(或同時存在兩個術語)。 |
|
+ |
要求出現以下術語。 |
|
- |
禁止使用以下術語(即不包含該術語的字段或文檔上的匹配項)。-運算符的功能與布爾運算符相似!.因爲它被流行的搜索引擎如谷歌使用,所以對某些用戶羣體來說可能更熟悉。 |
布爾運算符允許通過邏輯運算符組合術語。Lucene支持AND, “+”, OR, NOT ,“-”作爲布爾運算符。
當使用關鍵字指定布爾運算符時,關鍵字必須全部大寫。
標準查詢分析器支持上表中列出的所有布爾運算符。DisMax查詢分析器只支持+和-。
或運算符是默認的連接運算符。這意味着如果兩個術語之間沒有布爾運算符,則使用OR運算符。或運算符鏈接兩個術語,如果文檔中存在任何一個術語,則查找匹配的文檔。這相當於使用集合的並集。
要搜索包含“jakarta apache”或“jakarta”的文檔,請使用以下查詢:
"jakarta apache" jakarta
or
"jakarta apache" OR jakarta
- "+"
+符號(也稱爲“必需”運算符)要求在至少一個文檔的某個字段中存在+符號之後的術語,以便查詢返回匹配項。
例如,要搜索必須包含“jakarta”且可能包含或不包含“lucene”的文檔,請使用以下查詢:
+jakarta lucene
標準查詢解析器和DisMax查詢解析器都支持此運算符。
- "&&"
和運算符匹配兩個術語都存在於單個文檔文本中任何位置的文檔。這相當於使用集合的交集。符號&&可代替單詞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"
- "-"
-運算符是不包括包含-符號後的術語的文檔。
"jakarta apache" -"Apache Lucene"
- 轉義特殊字符
當以下字符出現在查詢中時,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
- Lucene經典查詢解析器與Solr標準查詢解析器的區別
Solr的標準查詢解析器源於Lucene的“經典”查詢解析器的變體。它分爲以下幾種:
*可用於任一或兩個端點,以指定開放式範圍查詢。
field:[* TO 100] 查找所有小於或等於100的字段值
field:[100 TO *] 查找所有大於或等於100的字段值
field:[* TO *] 將所有文檔與字段匹配
允許-查詢(禁止所有子句)(僅作爲頂級子句)
-inStock:false 查找instock非false的所有字段值。
-field:[* TO *]查找沒有字段值的所有文檔
支持使用任何類型的查詢分析器作爲嵌套子句使用本地參數語法的嵌入式SOLR查詢(子查詢)。
inStock:true OR {!dismax qf='name manu' v='ipod'}
注意:小心不要以開始查詢{!最開始,它改變了整個查詢字符串的解析,如果有附加子句,這可能不是您想要的。因此,翻轉上面的示例,使子查詢首先出現,如果沒有前導空格,將無法按預期工作。?
子查詢也可以用magic字段“_query_”來完成,也可以用magic字段“_val_來完成函數查詢,但由於不太清楚,因此應將其視爲已棄用。例子:
_val_:"recip(rord(myfield),1,2,3)"?
支持特殊的filter(…)語法,以指示某些查詢子句應緩存在篩選緩存中(作爲常量分數布爾查詢)。這允許子查詢被緩存並在其他查詢中重新使用。例如instock:true將被緩存,並在以下三個查詢中重新使用:
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])
範圍查詢(“[A到Z]”)、前綴查詢(“A*”)和通配符查詢(“A*B”)是恆定的評分(所有匹配的文檔都得到相同的評分)。不使用評分因子tf、idf、指數提升和“coord”。匹配的術語數量沒有限制(就像以前的Lucene版本一樣)。
常量分數查詢是用<query_clause>^=<score>創建的,它將整個子句設置爲與該子句匹配的任何文檔的指定分數:
q=(description:blue color:blue)^=1.0 title:blue^=5.0
- 指定日期和時間
對基於日期的字段的查詢必須使用適當的日期格式。對確切日期值的查詢將需要引用或轉義。
- createdate:1976-03-06T23\:59\:59.999Z
- createdate:"1976-03-06T23:59:59.999Z"
- createdate:[1976-03-06T23:59:59.999Z TO *]
- createdate:[1995-12-31T23:59:59.999Z TO 2007-03-06T00:00:00Z]
- timestamp:[* TO NOW]
- pubdate:[NOW-1YEAR/DAY TO NOW/DAY+1DAY]
- createdate:[1976-03-06T23:59:59.999Z TO 1976-03-06T23:59:59.999Z+1YEAR]
- createdate:[1976-03-06T23:59:59.999Z/YEAR TO 1976-03-06T23:59:59.999Z]