elasticsearch 基礎 —— Query String


使用查詢解析器來解析其內容的查詢。下面是一個例子:

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頂級參數包括: 

參數 描述

query

要解析的實際查詢。參見查詢字符串語法

default_field

如果未指定前綴字段,則查詢字詞的默認字段。默認為index.query.default_field索引設置,而索引設置默認為*.*提取映射中符合術語查詢條件的所有字段,並過濾元數據字段。然后組合所有提取的字段以在沒有提供前綴字段時構建查詢。

default_operator

如果未指定顯式運算符,則使用默認運算符。例如,使用默認運算符OR,查詢 capital of Hungary將轉換為capital OR of OR Hungary,並且使用默認運算符AND,將相同的查詢轉換為capital AND of AND Hungary。默認值為OR

analyzer

用於分析查詢字符串的分析器名稱。

quote_analyzer

分析器的名稱,用於分析查詢字符串中的引用短語。對於這些部件,它將覆蓋使用analyzer參數或 search_quote_analyzer設置設置的其他分析器。

allow_leading_wildcard

設置時,*?允許作為第一個字符。默認為true

enable_position_increments

設置為true在結果查詢中啟用位置增量。默認為true

fuzzy_max_expansions

控制模糊查詢將擴展到的術語數。默認為50

fuzziness

設置模糊查詢的模糊性。默認為AUTO。請參閱允許設置的模糊性編輯

fuzzy_prefix_length

設置模糊查詢的前綴長度。默認是0

fuzzy_transpositions

設置為false禁用模糊轉置(ab→ ba)。默認是true

phrase_slop

設置短語的默認斜率。如果為零,則需要精確的短語匹配。默認值是0

boost

設置查詢的提升值。默認為1.0

auto_generate_phrase_queries

默認為false

analyze_wildcard

默認情況下,不分析查詢字符串中的通配符。通過將此值設置為true,將盡最大努力分析這些值。

max_determinized_states

限制允許創建的regexp查詢的自動機狀態數。這可以防止太難(例如指數級硬)的regexp。默認為10000。

minimum_should_match

一個值,用於控制生成的布爾查詢中應該匹配的“should”子句的數量。它可以是絕對值(2),百分比(30%)或兩者的 組合

lenient

如果設置為true將導致基於格式的失敗(如向數字字段提供文本)將被忽略。

time_zone

時區應用於與日期相關的任何范圍查詢。另見 JODA時區

quote_field_suffix

附加到查詢字符串的引用部分的字段的后綴。這允許使用具有不同分析鏈的字段進行精確匹配。看看這里為一個完整的例子。

auto_generate_synonyms_phrase_query

是否應為多項同義詞自動生成短語查詢。默認為true

all_fields

6.0.0 ] 在6.0.0中已棄用。設置default_field*代替執行上可以查詢映射檢測到的所有字段的查詢。_all禁用該字段時將默認使用,並且未default_field指定no (在索引設置或請求正文中)並且未fields指定no 。

在生成多項查詢時,可以使用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對多個字段運行查詢時,允許使用以下附加參數:

參數 描述

type

應如何組合字段以構建文本查詢。有關完整示例,請參閱類型。默認為best_fields

參數 描述

tie_breaker

用於多場的分離最大連接斷路器。默認為0

 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使用

查詢字符串被解析為一系列術語運算符。術語可以是單個單詞 -  quickbrown - 或短語,由雙引號括起來 -  "quick brown" 以相同的順序搜索短語中的所有單詞。

操作員允許您自定義搜索 - 可用選項如下所述。

Field names

查詢字符串查詢中所述default_field,搜索搜索詞,但可以在查詢語法中指定其他字段:

  • 其中status字段包含active

    status:active
  • 其中title字段包含quickbrown。如果省略OR運算符,將使用默認運算符

    title:(quick OR brown)
    title:(quick brown)
  • 其中author字段包含精確短語"john smith"

    author:"John Smith"
    
  • 其中任何字段book.titlebook.contentbook.date包含 quickbrown(注意我們需要如何*使用反斜杠轉義):

    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 and omega, excluding alpha and omega:

    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將查找包含一個或多個foobar或的任何文檔 baz。我們已經討論了default_operator 上面的內容,它允許你強制要求所有的術語,但也有一些布爾運算符可以在查詢字符串本身中使用,以提供更多的控制。

首選運算符+(此術語必須存在)和- (此術語不得出現)。所有其他條款都是可選的。例如,這個查詢:

quick brown +fox -news

說明:

  • fox 必須存在
  • news 一定不能存在
  • quickbrown是可選的 - 它們的存在增加了相關性

熟悉的布爾運算符ANDOR以及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 空查詢

如果查詢字符串為空或僅包含空格,則查詢將生成空結果集。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM