使用查詢解析器來解析其內容的查詢。下面是一個例子:
GET /_search
{
"query": {
"query_string" : {
"default_field" : "content",
"query" : "this AND that OR thus"
}
}
}
query_string查詢解析輸入並在運算符周圍分割文本。每個文本部分彼此獨立地分析。例如以下查詢:
GET /_search
{
"query": {
"query_string" : {
"default_field" : "content",
"query" : "(new york city) OR (big apple)"
}
}
}
將分成new york city
或 big apple
,然后通過為該字段配置的分析器獨立地分析每個部分。
空格不被視為運算符,這意味着new york city將“按原樣”傳遞給為該字段配置的分析器。如果該字段是關鍵字字段,則分析器將創建單個術語new york city,並且查詢構建器將在查詢中使用此術語。如果要分別查詢每個術語,則需要在術語周圍添加顯式運算符(例如new AND york AND city)
當提供多個字段時,也可以修改如何使用類型參數在每個文本部分內組合不同字段查詢。這里描述了可能的模式,默認是Bestfield。query_string頂級參數包括:
參數 | 描述 |
---|---|
|
要解析的實際查詢。參見查詢字符串語法。 |
|
如果未指定前綴字段,則查詢字詞的默認字段。默認為 |
|
如果未指定顯式運算符,則使用默認運算符。例如,使用默認運算符 |
|
用於分析查詢字符串的分析器名稱。 |
|
分析器的名稱,用於分析查詢字符串中的引用短語。對於這些部件,它將覆蓋使用 |
|
設置時, |
|
設置為 |
|
控制模糊查詢將擴展到的術語數。默認為 |
|
|
|
設置模糊查詢的前綴長度。默認是 |
|
設置為 |
|
設置短語的默認斜率。如果為零,則需要精確的短語匹配。默認值是 |
|
設置查詢的提升值。默認為 |
|
默認為 |
|
默認情況下,不分析查詢字符串中的通配符。通過將此值設置為 |
|
限制允許創建的regexp查詢的自動機狀態數。這可以防止太難(例如指數級硬)的regexp。默認為10000。 |
|
一個值,用於控制生成的布爾查詢中應該匹配的“should”子句的數量。它可以是絕對值( |
|
如果設置為 |
|
時區應用於與日期相關的任何范圍查詢。另見 JODA時區。 |
|
附加到查詢字符串的引用部分的字段的后綴。這允許使用具有不同分析鏈的字段進行精確匹配。看看這里為一個完整的例子。 |
|
是否應為多項同義詞自動生成短語查詢。默認為 |
|
[ |
在生成多項查詢時,可以使用rewrite 參數控制如何重寫它 。
Default Field
如果未在查詢字符串語法中明確指定要搜索的字段,index.query.default_field
則將使用該字段來派生要搜索的字段。如果index.query.default_field
未指定,query_string
則將自動嘗試確定索引映射中可查詢的現有字段,並對這些字段執行搜索。請注意,這不包括嵌套文檔,使用嵌套查詢來搜索這些文檔。
Multi Field
該query_string
查詢還可以運行針對多個領域。可以通過"fields"
參數提供字段(示例如下)。
field1:query_term OR field2:query_term | ...
query_string
針對多個字段運行查詢的想法是將每個查詢字詞擴展為OR子句,如下所示:
例如,以下查詢
GET /_search
{
"query": {
"query_string" : {
"fields" : ["content", "name"],
"query" : "this AND that"
}
}
}
匹配相同的單詞
GET /_search
{
"query": {
"query_string": {
"query": "(content:this OR name:this) AND (content:that OR name:that)"
}
}
}
由於從單個搜索項生成了多個查詢,因此使用dis_max
帶有tie_breaker 的查詢自動組合它們。例如(name
使用^5
符號表示增強5 ):
GET /_search
{
"query": {
"query_string" : {
"fields" : ["content", "name^5"],
"query" : "this AND that OR thus",
"tie_breaker" : 0
}
}
}
簡單通配符也可用於搜索文檔的特定內部元素“內”。例如,如果我們有一個city
包含多個字段(或帶有字段的內部對象)的對象,我們可以自動搜索所有“城市”字段:
GET /_search
{
"query": {
"query_string" : {
"fields" : ["city.*"],
"query" : "this AND that OR thus"
}
}
}
另一種選擇是在查詢字符串本身中提供通配符字段搜索(正確轉義*
符號),例如 city.\*:something
:
GET /_search
{
"query": {
"query_string" : {
"query" : "city.\\*:(this AND that OR thus)"
}
}
}
由於
\
(反斜杠)是json字符串中的特殊字符,因此需要對其進行轉義,因此上面的兩個反斜杠query_string
query_string
對多個字段運行查詢時,允許使用以下附加參數:
參數 | 描述 |
---|---|
|
應如何組合字段以構建文本查詢。有關完整示例,請參閱類型。默認為 |
參數 | 描述 |
---|---|
|
用於多場的分離最大連接斷路器。默認為 |
fields參數還可以包括基於通配符字段名稱,允許自動擴展到相關字段(包括動態引入的字段)。例如:
GET /_search
{
"query": {
"query_string" : {
"fields" : ["content", "name.*^5"],
"query" : "this AND that OR thus"
}
}
}
Synonyms 同義詞
該query_string
查詢支持使用synonym_graph標記過濾器進行多項同義詞擴展。使用此過濾器時,解析器會為每個多項同義詞創建一個短語查詢。例如,以下同義詞:"ny, new york" would produce:
(ny OR ("new york"))
也可以將多項同義詞與連詞相匹配:
GET /_search
{
"query": {
"query_string" : {
"default_field": "title",
"query" : "ny city",
"auto_generate_synonyms_phrase_query" : false
}
}
}
上面的例子創建了一個布爾查詢:
(ny OR (new AND york)) city)
將文檔與術語ny
或連詞匹配new AND york
。默認情況下,參數auto_generate_synonyms_phrase_query
設置為true
。
Query string syntax
查詢字符串“迷你語言”由 查詢字符串查詢和API中的 q
查詢字符串參數search
使用。
查詢字符串被解析為一系列術語和運算符。術語可以是單個單詞 - quick
或brown
- 或短語,由雙引號括起來 - "quick brown"
以相同的順序搜索短語中的所有單詞。
操作員允許您自定義搜索 - 可用選項如下所述。
Field names
如查詢字符串查詢中所述default_field
,搜索搜索詞,但可以在查詢語法中指定其他字段:
-
其中
status
字段包含active
status:active
-
其中
title
字段包含quick
或brown
。如果省略OR運算符,將使用默認運算符title:(quick OR brown) title:(quick brown)
-
其中
author
字段包含精確短語"john smith"
author:"John Smith"
-
其中任何字段
book.title
,book.content
或book.date
包含quick
或brown
(注意我們需要如何*
使用反斜杠轉義):book.\*:(quick brown)
-
該字段
title
具有任何非null值:_exists_:title
Wildcards 通配符
通配符搜索可以在單個術語上運行,使用?
替換單個字符,並*
替換零個或多個字符:
qu?ck bro *
請注意,通配符查詢可能使用大量的內存,並且執行得很糟糕,只要想想需要查詢多少項來匹配查詢字符串“a*b*c*”。
純通配符
\*
被重寫為exists
查詢效率。因此,通配符"field:*"
將匹配具有空值的文檔,如下所示:````{“field”:“”}```... 如果字段丟失或使用顯式空值設置則不匹配如下所示:```{`field“:null}```
允許在單詞的開頭(例如
"*ing"
)使用通配符特別重,因為需要檢查索引中的所有術語,以防它們匹配。可以通過設置allow_leading_wildcard
為禁用前導通配符false
Regular expressions 正則表達式
正則表達式模式可以通過將它們包裝在forward-slashes("/"
)中嵌入查詢字符串中:
name:/joh?n(ath[oa]n)/
正則表達式語法中解釋了受支持的正則表達式語法。
該
allow_leading_wildcard
參數對正則表達式沒有任何控制權。如下所示的查詢字符串將強制Elasticsearch訪問索引中的每個術語:/.*n/ 謹慎使用!
Fuzziness 模糊
我們可以使用“fuzzy”運算符搜索與我們的搜索字詞類似但不完全相同的字詞:
quikc~ brwn~ foks~
它使用 Damerau-Levenshtein distance 來查找最多有兩個變化的所有術語,其中一個變化是插入、刪除或替換單個字符,或替換兩個相鄰字符。
默認編輯距離為2,但是編輯距離為1應該足以捕捉所有人類拼寫錯誤的80%。它可以被指定為:
quikc~1
Proximity searches 鄰近搜索
雖然短語查詢(例如"john smith"
)期望所有術語具有完全相同的順序,但是鄰近查詢允許指定的單詞更遠或者以不同的順序。與模糊查詢可以為單詞中的字符指定最大編輯距離的方式相同,鄰近搜索允許我們指定短語中單詞的最大編輯距離:
"fox quick"~5
字段中的文本越接近查詢字符串中指定的原始順序,該文檔被認為越相關。與上面的示例查詢相比,該短語"quick fox"
將被視為更相關"quick brown fox"
。
Ranges 范圍
可以為日期,數字或字符串字段指定范圍。包含范圍用方括號指定,[min TO max]
排他范圍用大括號指定{min TO max}
。
-
All days in 2012:
date:[2012-01-01 TO 2012-12-31]
-
Numbers 1..5
count:[1 TO 5]
-
Tags between
alpha
andomega
, excludingalpha
andomega
:tag:{alpha TO omega}
-
Numbers from 10 upwards
count:[10 TO *]
-
Dates before 2012
date:{* TO 2012-01-01}
可以組合使用大括號和方括號:
-
數字從1到5但不包括5
count:[1 TO 5}
一邊無范圍的范圍可以使用以下語法:
age:>10
age:>=10
age:<10
age:<=10
要將上限和下限與簡化語法結合使用,您需要將兩個子句與AND
運算符連接:
age:(>=10 AND <20)
age:(+>=10 +<20)
查詢字符串中的范圍解析可能很復雜且容易出錯。使用顯式range
查詢更加可靠。
Boosting 提升權重
使用boost運算符^
使一個術語比另一個術語更相關。例如,如果我們想要找到關於foxes的所有文檔,但我們對quick foxes特別感興趣:
quick^2 fox
默認boost
值為1,但可以是任何正浮點數。0到1之間的提升會降低相關性。
提升也可以應用於短語或群組:
"john smith"^2 (foo bar)^4
Boolean operators 布爾運算符
默認情況下,只要一個術語匹配,所有術語都是可選的。搜索foo bar baz
將查找包含一個或多個foo
或bar
或的任何文檔 baz
。我們已經討論了default_operator
上面的內容,它允許你強制要求所有的術語,但也有一些布爾運算符可以在查詢字符串本身中使用,以提供更多的控制。
首選運算符+
(此術語必須存在)和-
(此術語不得出現)。所有其他條款都是可選的。例如,這個查詢:
quick brown +fox -news
說明:
fox
必須存在news
一定不能存在quick
和brown
是可選的 - 它們的存在增加了相關性
熟悉的布爾運算符AND
,OR
以及NOT
(也寫作&&
,||
和!
)也支持,但要小心,他們不遵守通常的優先級規則,所以每當多個運營商一起使用時,應使用括號。例如,以前的查詢可以重寫為:
((quick AND fox) OR (brown AND fox) OR fox) AND NOT news
此表單現在可以正確復制原始查詢中的邏輯,但相關性評分與原始查詢幾乎沒有相似之處。
相反,使用查詢重寫的相同match
查詢 將如下所示:
{
"bool": {
"must": { "match": "fox" },
"should": { "match": "quick brown" },
"must_not": { "match": "news" }
}
}
Grouping 分組
可以將多個術語或子句與括號組合在一起,以形成子查詢:
(quick OR brown) AND fox
組可用於定位特定字段,或用於提升子查詢的結果:
status:(active OR pending) title:(full text search)^2
Reserved characters 保留字符
如果你需要在查詢本身中使用任何作為運算符的字符(而不是運算符),那么你應該使用前導反斜杠來轉義它們。例如,要搜索(1+1)=2
,您需要將查詢編寫為\(1\+1\)\=2
。
保留的字符是: + - = && || > < ! ( ) { } [ ] ^ " ~ * ? : \ /
無法正確轉義這些特殊字符可能會導致語法錯誤,從而阻止您的查詢運行。
<and>根本無法轉義。 阻止它們嘗試創建范圍查詢的唯一方法是完全從查詢字符串中刪除它們。
Empty Query 空查詢
如果查詢字符串為空或僅包含空格,則查詢將生成空結果集。