【Elasticsearch】query_string的各種用法


參考官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

 

 

1.例子

 

{
      "query_string":{
            "default_field":"name",
            "query":"(this AND that) OR thu*"
       }

}

 

 

2. 參數

這里只挑幾個常用的參數說一下,其他的一般默認就夠了

 

 

 

  • query:  需要查詢的具體內容
  • default_field:  查詢的字段

默認是_all,即對所有字段進行查詢。

支持多字段——"fields" : ["age", "name"],fields中只要有一個字段滿足query的條件即可匹配查詢。

支持一些簡單的wildcard寫法。比如fields:[“nam*”]即任何nam開頭的字段,注意:如果field與query寫在一起比如”query”:”name:obama”,要使用wildcard需要轉義--->”query”:”nam\\*:obama”

當fields有多個的時候,會有另外一個參數:

use_dis_max: true代表使用dis_max查詢,false為bool查詢

至於use_dis_max的用法:請參考http://blog.csdn.NET/dm_vincent/article/details/41820537

 

  • default_operator:默認運算符

 

   有AND、OR,默認為OR。比如query里面的內容是”cat dog”,兩個短語以空格分開,如果default_operator參數為OR,那么只要字段內包含cat或者dog之一就可以匹配。

  如果default_operator為AND,字段內必須同時包含cat和dog才可以匹配。與bool查詢挺像的。

  • analyzer:分析器

   用於分析query內容的分析器。 

 

       這里需要注意的是query_string查詢,query的內容會經過分析。其他的查詢比如match查詢也是會分析的,term查詢會分析。打個比方:

 

               PUT /animal { "name": “DOG”}

 

   因為分析器的原因,進行index的時候DOG會自動變成小寫的dog.query_string與match查詢因為查詢的內容也會被分析,所以查詢DOG時會自動判斷為查詢dog。而term查詢不然,你查詢DOG,

      那么Elasticsearch就會去索引里    找DOG,很顯然索引里只有小寫的dog,你是無法查詢成功的。

  • minimum_should_match: 最小匹配詞條

   比如query:”cat dog mouse”,這個配置項為2,那么只有字段里至少同時包含這三個中的任意兩個才會匹配。需要注意的是,這個配置項只對default_operator為OR的時候生效。如果這個是AND,

   那么cat dog mouse必須全部包含無論minimum_should_match為多少。

 

 

 

3.語法

常見寫法:

{“query”:{“query_string”:{“name:obama”}}}

name字段為obama

{“query”:{“query_string”:{“nam\\*:obama”}}}

存在一個nam開頭的字段,值為obama

{“query”:{“query_string”:{“__missing__:name”}}}

name字段值為null的文檔

{“query”:{“query_string”:{“__exists__:name”}}}

name字段值不為null的文檔

{“query”:{“query_string”:{“name:(obama OR xidada)”}}}

 

name字段為Obama或者xidada的文檔


 

注意這里!一定不要把這里的OR、AND與前面的混淆,minimum_should_match更需要注意運算符。如果這里全是OR,那么你可以用minimum_should_match,如果混用AND OR 一定不要用這個參數。如果一定要用請把AND連接的用()括起來。

另外a OR b OR c.minimum_should_match為3代表 需要包含a b c三個。如果你用括號括起來(a OR b) OR c 那么括號內的將不是兩個條件而是一個整體的條件,minimum_should_match為2 即代表需要同時包含a b c三個。

 

 

Wildcards

 

query的內容中支持?與*。?可以代替一個任意字符、 *可代表任意個字符(包括零個)。比如你要查詢的內容很長,記不清了但是你記得末尾是tor,那么你只需要把query內容寫成*tor即可


正則

如果要在query的內容中使用正則表達式,在兩端加上正斜杠/即可。比如name:/ob[am]{2}a/

支持的正則語法見:

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax


 

模糊查詢

 

這個是一個很實用的功能。你想搜obama可是你記不清了或者你錯打成了obalv。沒事,只要你在查詢的時候加個~就不用擔心了: “query”:”name:obalv~”,你會驚喜的發現仍然可以搜到obama。

另外你可以在~后面加個數字來指定允許錯誤幾個字母。默認以及最大都是2。比如你寫成“query”:”name:obalv~1”,就只能允許一個錯誤,而你查詢的內容錯了兩個字母,就無法搜到obama了。


range范圍查詢

具體語法為:[min TO max] 閉區間。{min TO max}開區間。不允許左閉右開!左開右閉!

 

date:[2012-01-01 TO 2012-12-31]

count:[1 TO 5]

count:[10 TO *]

age:>10

age:<=10

布爾運算符

這一章最開頭提到了一些OR、AND。另外支持的運算符有+、-
+代表一定要出現:類似must。-代表一定不能包含:類似must_not
比如:"query":"cat -dog +mouse"  這個就代表文檔中必須包含mouse,必須不能包含dog

 

原文地址:http://blog.csdn.net/u014587343/article/details/50538394


免責聲明!

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



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