【Elasticsearch學習】DSL搜索大全


1.復合查詢

  復合查詢能夠組合其他復合查詢或者查詢子句,同時也可以組合各個查詢的查詢結果及得分,也可以從Query查詢轉換為Filter過濾器查詢。

  首先介紹一下Query Context和 Filter Context

  1)Query Context查詢主要關注的是文檔和查詢條件的匹配度,Query查詢會計算文檔和查詢條件的相關度評分。

  2)Filter Context過濾器主要關注文檔是否匹配查詢條件,並不關系文檔和查詢條件的匹配程度,也不會計算文檔的相關度評分。過濾器查詢速度比普通查詢快,經常使用的過濾器將被ES自動緩存。

GET /kibana_sample_data_ecommerce/_search
{
  "query": { //query context
    "bool": { 
      "must": [
        { "match": { "customer_first_name": "Eddie"}},
        { "match": { "customer_gender": "MALE" }}
      ],
      "filter": [  // filter context
        { "term":  { "currency": "EUR" }},
        { "range": { "order_id": { "gte": "584679" }}}
      ]
    }
  }
}

1.1.Boolean Query

  Bool查詢由一個或多個bool查詢子句組成,允許組合任意數量的查詢子句,bool查詢共有4鍾查詢類型。

  1)must

  如果查詢子句為must,那么must子句中的所有查詢條件都必須在匹配文檔中出現。

  2)must_not

  查詢條件中的任何一部分不能在文檔中出現。

  3)should

  查詢條件可以在匹配文檔中出現也可以不出現,但是出現的數量至少要達到minimum_should_match參數所設置的數量,如果組合中使用了must子句,該值默認為0,如果沒有使用該值默認為1.

  4)filter

  查詢條件必須出現在匹配的文檔中,但是該查詢子句對於文檔的評分沒有影響,僅對文檔進行過濾。

  http://127.0.0.1:9200/kibana_sample_data_ecommerce/_search

{
  "query": {
    "bool" : {
      "must" : [
      	{
          "term" : { "day_of_week": "Monday" }
      	},
      	{
      	  "term" : {"customer_gender": "FEMALE"}
      	}
      ]
    }
  }
}

1.2Boosting Query

  Boosting Query返回和positive查詢條件匹配的文檔,減少與negative查詢條件匹配的文檔的分數。注意,只有匹配了positive查詢條件的文檔才會被返回,negative只是降低同時匹配positive條件和negative查詢條件的文檔的相關性評分。negative_boost為介於0和1.0之間的浮點數,用於降低與negative查詢條件匹配的文檔相關性評分。

GET /kibana_sample_data_ecommerce/_search
{
    "query": {
        "boosting" : {
            "positive" : {
                "match": {
                    "customer_first_name" : "Eddie"
                }
            },
            "negative" : {
                  "match" : {
                    "customer_last_name" : "Underwood"
                }
            },
            "negative_boost" : 0.5
        }
    }
}

1.3Constant Score Query

  包裝filter查詢,返回所有匹配的文檔,但是文檔的相關度評分等於查詢傳入的boost值,默認值為1.0。

GET /kibana_sample_data_ecommerce/_search
{
    "query": {
        "constant_score" : {
            "filter" : {
                "match" : { "customer_first_name" : "Eddie"}
            },
            "boost" : 1.2
        }
    }
}

1.4Disjunction Max Query

  將與任何一個查詢條件匹配的文檔作為結果返回,但是采用單個字段上最匹配的評分作為最終評分返回。

首先看一個不使用dis_max查詢多查詢字段匹配的例子,

GET /test/_search
{
    "query": {
        "bool": {
            "should": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

返回:可以看到文檔2的body字段更加匹配查詢條件"body": "Brown fox",但是由於文檔1的title字段和body字段都有"brown"所以其評分疊加起來比文檔2的評分更高。

{
  "hits" : {
    "max_score" : 0.90425634,
    "hits" : [
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.90425634,
        "_source" : {
          "title" : "Quick brown rabbits",
          "body" : "Brown rabbits are commonly seen."
        }
      },
      {
        "_index" : "test",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 0.77041256,
        "_source" : {
          "title" : "Keeping pets healthy",
          "body" : "My quick brown fox eats rabbits on a regular basis."
        }
      }
    ]
  }
}

  dis_max不會將查詢條件各個字段評分做簡單的相加,而是將與查詢條件匹配得分最高的單個字段的評分作為文檔的評分返回。如下例:

GET /test/_search
{
    "query": {
        "dis_max": {
            "queries": [
                { "match": { "title": "Brown fox" }},
                { "match": { "body":  "Brown fox" }}
            ]
        }
    }
}

返回:可以看到使用dis_max后文檔1的評分降低了。

{  
  "hits" : { "max_score" : 0.77041256, "hits" : [ { "_index" : "test", "_type" : "_doc", "_id" : "2", "_score" : 0.77041256, "_source" : { "title" : "Keeping pets healthy", "body" : "My quick brown fox eats rabbits on a regular basis." } }, { "_index" : "test", "_type" : "_doc", "_id" : "1", "_score" : 0.6931471, "_source" : { "title" : "Quick brown rabbits", "body" : "Brown rabbits are commonly seen." } } ] } }

  dis_max查詢的tie_breaker參數,如果在查詢的時候根據查詢場景需要考慮到其他查詢字段的得分,則可以使用tie_breaker參數[0.0,1.0],使用tie_beaker之后,計算得分的過程將變為:

  1.取到與查詢條件最匹配的單個字段的評分,2.將與其他查詢條件匹配的得分乘以tie_beaker,3.將1中最高分和2中的得分相加作為文檔的評分返回。

1.5Function Score Query

  function score query可以在查詢結束后,對每一個匹配的文檔重新算分,根據新生成的分數進行排序。  

GET /_search
{
    "query": {
        "function_score": {
          "query": { "match_all": {} },
          "boost": "5", 
          "functions": [
              {
                  "filter": { "match": { "test": "bar" } },
                  "random_score": {}, 
                  "weight": 23
              },
              {
                  "filter": { "match": { "test": "cat" } },
                  "weight": 42
              }
          ],
          "max_boost": 42,
          "score_mode": "max",
          "boost_mode": "multiply",
          "min_score" : 42
        }
    }
}

   score_mode:每一個文檔將會被定義的函數打分,當有多個函數時由score_mode決定如何去組合各個函數的打分,score_mode的幾個方法:multiply,各個得分相乘;sum,分數相加;avg,分數取平均;first,用第一個有match filter的函數的評分;max,選取分數的最大值;min,選取分數的最小值。

  weight:因為各個函數的打分范圍不同,例如衰減函數打分范圍為[0,1],而field_value_factor的打分值是任意的,而且有時候希望不同的函數對文檔的分數有不同的影響,用戶可以使用weight權重來調整各個函數的得分,在每個function中定義weight的數值,函數計算出文檔的得分后將會和其定義的weight值。

  max_score:用於限制得分,function算出的新得分會被限制在max_boost內,默認為FLT_MAX。

  boost_mode:決定function算出的分和query的得分如何組合:multiply,function和query得分相乘;replace,使用function的得分替換query的得分;sum,兩者得分相加;avg,取兩者均值;max,取兩者較大值;min,取兩者較小值。 

 min_score:用於排除分值低於閾值的文檔。

 function score支持的幾種改變分值的函數:

  1)script_score:包裝一個子查詢,通過自定義腳本的方式完全自定義計算文檔的得分。

  2)Weight:為每個文檔設置一個權重,將文檔的得分乘以該權重,該參數和boost類似,boost對文檔得分的提升不是線性的,文檔得分在乘以boost值后會被歸一化(nomalize)處理,所以當不想將得分歸一化處理時即可使用Weight來提升文檔的得分。

  3)random_score:隨機均勻的產生在[0,1)之間的得分,可以為該函數提供種子(seed)和計算得分的字段(filed),這樣來保證分數的可復制性。最后的得分將基於seed、filed以及salt(salt由索引名和分片id計算得來),所以有相同的值但是存儲在不同索引中的文檔會有不同的評分。但是在同一個分片中並具有相同字段值的文檔將獲得相同的分數,因此通常需要使用具有唯一值的字段來進行評分。

  4)field_value_factor:可以使用文檔中的字段來影響文檔的得分

    參數:field,用來計算得分的字段;factor,得分的乘數;modifier,得分的計算公式,可以為none(默認值)loglog1plog2plnln1pln2psquaresqrt, reciprocal;missing,如果指定的filed字段文檔中沒有,默認使用的值。如下計算公式為:sqrt(1.2 * doc['likes'].value)

"query": { "function_score": { "field_value_factor": { "field": "likes", "factor": 1.2, "modifier": "sqrt", "missing": 1 } } }

  5)Decay functions:衰減函數,用戶指定一個文檔中的字段的值,衰減函數根據距離這個值的距離來進行打分;查詢時需要為每個字段定義origin值和scale值,

    origin代表的是中心點,用以計算其他值到中心點的距離;
    scale代表衰減的范圍,衰減的范圍為[origin-offset-scale,origin-offset],[origin+offset,origin+offset+scale]

    此外有兩個可選值:offset、decay   

    offset表示衰減函數只計算到中心點距離大於offset的文檔,即衰減函數計算的范圍是[origin-offset-scale,origin-offset],[origin+offset,origin+offset+scale];

    decay表示衰減到兩個邊界上時origin-offset-scale,origin+offset+scale文檔的得分,默認為0.5分。如圖:

     

    舉例說明各參數的作用:假設衰減函數的origin定義為100,scale定義為10,offset定義為10,decay為0.5,那么衰減函數只會計算文檔[80,90],[110,120],即介於90與110之間的文檔評分與origin得分一樣,在[80,90],[110,120]之間文檔得分將會進行衰減,在80,120邊界上的文檔得分是decay:0.5。

如下例所示:DECAY_FUNCTION可以是linear(線性)、exp(指數)、gauss(高斯)這三種衰減函數,FILED_NAME即用來評分的字段必須為數值型、日期型或地理位置型。

"DECAY_FUNCTION": { 
    "FIELD_NAME": { 
          "origin": "11, 12",
          "scale": "2km",
          "offset": "0km",
          "decay": 0.33
    }
}

日期型衰減函數:

"function_score": {
            "gauss": {
                "date": {
                      "origin": "2013-09-17", 
                      "scale": "10d",
                      "offset": "5d", 
                      "decay" : 0.5 
                }
            }
        }

  如果用於計算衰減的字段包含多個值,在默認情況下,將選擇最接近原點的值來確定距離,可以通過設置multi_value_mode來改變這個方法:min:衰減距離使用多個字段距離中的最小值,max:衰減距離使用多個字段距離中的最大值,avg:衰減距離使用多個字段距離的平均值,sum衰減距離使用多個字段距離的和。

2.全文檢索

  全文檢索使用戶能夠搜索分析過的文本,查詢的關鍵字也會被文檔索引時使用的分析器進行處理。

2.1Intervals Query

  允許對匹配詞項的順序和鄰近性進行細粒度控制。用戶可以應用一個或多個規則集合在指定的字段上進行操作。  

POST _search
{
  "query": {
    "intervals" : {
      "my_text" : {
        "all_of" : {
          "ordered" : true,
          "intervals" : [
            {
              "match" : {
                "query" : "my favorite food",
                "max_gaps" : 0,
                "ordered" : true
              }
            },
            {
              "any_of" : {
                "intervals" : [
                  { "match" : { "query" : "hot water" } },
                  { "match" : { "query" : "cold porridge" } }
                ]
              }
            }
          ]
        }
      }
    }
  }
}

  interval查詢頂層參數:

  Field,用戶希望查詢的字段,上例為my_text。Field的參數為一個基於詞項匹配度、順序、接近度規則的對象用於匹配文檔,上例為{"all_of":"...."}。

  有如下一些規則:

  1)match:match規則匹配分析后的文本。參數:

    query:希望在Field字段中匹配的內容。

    max_gaps:匹配的詞項之間間隔的最大詞數,超過max_gaps的被視為不匹配,默認為-1,如果沒有設定,則對詞項之間的間隔沒有限制;如果設置為0,那么匹配的詞項之間必須僅僅相鄰。

    ordered:如果為true,那么匹配的詞項出現的順序必須和查詢內容的順序一致,默認為false。

        analyzer:用於分析查詢內容的分析器,默認和文檔的分析器一致。

    filter:intervals filter。

    use_field:如果指定該字段,那么此規則將應用於該字段而不是頂層Field字段。  

POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "match" : {
          "query" : "quick rabbits",
          "max_gaps" : 10
        }
      }
    }
  }
}

     2)prefix:前綴規則匹配以指定字符集開頭的詞項,prefix最多可以擴展到匹配128個字符,如果超過128個字符,ES將返回錯誤。參數:

   prefix:希望頂層Field開頭的字符。

   analyzer:用以處理prefix的分析器。

   use_field:如果指定該字段,那么此規則將應用於該字段而不是頂層Field字段。

POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "prefix" : {
          "prefix" : "Keeping",
          "use_field":"title"
        }
      }
    }
  }
} 

  3)wildcard:wildcard使用通配符模式,最多能匹配128個詞項。參數:

  pattern:通配符,支持*、?兩種通配符。

  analyzer:同上。

  use_field:同上。

POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "wildcard" : {
          "pattern" : "rab?i*"
        }
      }
    }
  }
}

  4)fuzzy:模糊規則匹配與提供的term相似的詞項。參數:

  term:需要匹配的詞項。

  prefix_length:保持不變的前綴的數量。

  transpositions:模糊規則是否包含兩個相鄰字符的轉換,默認為true。

  fuzziness:通常被解釋為萊文斯坦距離也叫做Edit Distance,指的是一個詞與另一個詞匹配需要編輯的次數,編輯操作替換字符,插入字符,刪除字符,需要編輯的次數越多,說明Edit Distance越大。fuzziness的參數:0,1,2表示最大的編輯次數,默認為AUTO參數,表示根據term的長度自動生成編輯次數。

  analyzer:同上。

  use_field:同上。

POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "fuzzy" : {
          "term" : "rabibst",//需要移動兩次
          "fuzziness":2 //兩次edit
        }
      }
    }
  }
}

  5)all_of:綜合其他的interval規則,返回的文檔必須滿足所有的intervals規則。參數:

  intervals:要組合的規則數組。

  max_gaps:

  ordered:決定各個規則產生的結果是否排序。

  filter:intervals filter。

POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "all_of" : {
          "intervals" : [//match、prefix規則均需滿足
            {
              "match" : {
                "query" : "quick"
              }
            },
            {
              "prefix" : {
                "prefix":"My"
              }
            }
           ]
        }
      }
    }
  }
}

  6)any_of:滿足任一子規則的文檔即可返回。

  intervals:匹配的規則數組。

  filter:intervals filter。

POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "any_of" : {
          "intervals" : [ //match、prefix規則滿足其一即可
            {
              "match" : {
                "query" : "commonly"
              }
            },
            {
              "prefix" : {
                "prefix":"My"
              }
            }
           ]
        }
      }
    }
  }
}  

  intervals filter參數:

    after:匹配的詞項在filter rule后。

    before:匹配的詞項在filter rule前。

    contained_by:匹配的詞項由filter rule包含。

    not_contained_by:匹配的詞項不被filter rule包含。

        not_containing:fiter rule不在匹配間隙之間出現。

    not_overlapping:匹配的詞項和filter rule不重疊。

    overlapping:匹配的詞項和filter rule有重疊。

    script:決定文檔是否返回的自定義腳本。

POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "match" : {
          "query" : "commonly",
          "filter":{
            "contained_by" : {
              "match" : {
                "query" : "Brown seen" //brown seen 必須包含commonly詞項
              }
            }
          }
        }
      }
    }
  }
}     
POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "match" : {
          "query" : "brown rabbits",
          "max_gaps" : 10,
          "filter":{
            "not_containing" : {
              "match" : {
                "query" : "fox" //fox 不能出現在brown rabbits 之間
              }
            }
          }
        }
      }
    }
  }
}
POST /test/_search
{
  "query": {
    "intervals" : {
      "body" : {
        "match" : {
          "query" : "commonly",
          "filter":{
            "overlapping" : {
              "match" : {
                "query" : "Brown seen" //match規則查出的結果文檔為Brown rabbits are commonly seen 與commonly 有重疊的地方
              }
            }
          }
        }
      }
    }
  }
}

2.2Match Query  

  返回與提供的搜索文本相匹配的文檔,搜索文本在匹配之前會被分析器進行分析。

  參數:

  頂層參數:Filed,表示想要搜索的字段。

  Field下的參數:

  1.query:想要在Field字段中匹配到的內容,match查詢在查詢之前會對查詢內容進行分析。

  2.analyzer:分析器,如果field的mapping中有定義分析器,則使用field的分析器,如果沒有,則使用索引默認的分析器。

  3.auto_generate_synonyms_phrase_query:是否開啟同義詞匹配,默認為false。

  4.fuzziness:模糊匹配,參數見interval query fuzzy。
  5.max_expansions:控制模糊匹配fuzzy能擴展多少個模糊選項。如test在fuzziness為1的時候,能匹配很多模糊選項:tes,tets,etst等,使用max_expansions控制能匹配多少個模糊選項。

  6.prefix_length:fuzzy匹配時,保持不變的字符前綴數,默認為0。

  7.transpositions:如果true,那么fuzzy匹配允許字符交換位置,ab->ba。
  8.fuzzy_rewrite:重寫查詢的方法,

  9.lenient:如果true,則忽略查詢格式錯誤,例如為數值字段提供文本查詢值。默認為false。

  10.operator:用於解析查詢值的bool邏輯。默認為OR,如果Query值為quick brown fox,則匹配規則為quick or brown or fox;此外還有AND值。

  11.minimum_should_match:返回的文檔必須匹配的子句數量。

  12.zero_terms_query:決定當分析器移除所有的分詞時是否返回文檔,如當查詢內容中都是停用詞時,所有的分詞被分析器的停用詞過濾器過濾掉時,是否返回文檔。默認為none,不返回任何文檔,all,返回所有文檔。  

測試數據:
POST /test/_doc/3
{
    "title": "tets healthy",
    "body":  "My quick brown fox eats rabbits on a regular basis."
}
POST /test/_doc/4
{
    "title": "tes healthy",
    "body":  "My quick brown fox eats rabbits on a regular basis."
}

測試案例:

POST /test/_search
{
    "query": {
        "match" : {
            "title":{
              "query":"test",
              "fuzziness":1,
              "max_expansions": 1 //最大擴展數,test只允許有一個模糊選項,匹配的結果只有一個
            }
        }
    }
}

2.3Match boolean prefix query    

 

   match_bool_prefix分析查詢內容,並將分詞出來的各個詞項組合成為一個bool查詢,除了最后一個詞項其他的詞項都會被用在term query中,最后一個詞項被用在prefix query中。

例如:

POST /test/_search
{
    "query": {
        "match_bool_prefix" : {
            "message" : "quick brown f"
        }
    }
}

這個查詢類似於:

POST /test/_search
{
    "query": {
        "bool" : {
            "should": [
                { "term": { "message": "quick" }},
                { "term": { "message": "brown" }},
                { "prefix": { "message": "f"}}
            ]
        }
    }
}

  參數:

  頂層參數:Filed,表示想要搜索的字段。

  1.query:想要在Field字段中匹配到的內容。

  2.analyzer:分析器,默認使用字段mapping中的分析器。

  3.minimum_should_match:返回的文檔最少匹配查詢條件的程度。

 

  4.operator:使用AND還是OR去連接詞項。

  5.模糊查詢可以用於所有的分詞起器分析出的詞項,除了最后一個詞項。

POST /test/_search
{
    "query": {
        "match_bool_prefix" : {
            "body": {
                "query": "fox eats",
                "operator":"AND",
                "fuzziness":1
            }
        }
    }
}

2.4Match phrase query

  match_phrase查詢分析搜索內容並創建一個短語查詢。

  match_phrase的詞項之間的間隔為0,analyzer使用查詢字段mapping字段定義,如果未定義則使用默認查詢分析器。

GET /test/_search
{
    "query": {
        "match_phrase" : {
            "body": {
                "query": "quick brown fox",
          "analyzer":"whitespace" } } } }

2.5Match phrase prefix query

  返回包含搜索內容的文檔,與搜索內容提供的順序一致。搜索內容的最后一個詞項作為前綴匹配任何以前綴開始的詞項。

  參數:

  頂層參數:Filed,表示想要搜索的字段。

  query:想要搜索的文本。

  analyzer:分析器。

  max_expansions:最后一個查詢詞作為前綴去匹配到的詞項最多擴展數。

  slop:分詞之間的最大間隔數,默認為0。

  zero_terms_query:見Match Query。

GET /test/_search
{
    "query": {
        "match_phrase_prefix" : {
            "body" : {
                "query" : "quick brown f",
                "max_expansions": 2 //為2代表以f開頭的詞項只會返回兩種
            }
        }
    }
}

2.6Multi match query

  multi match query以match query為基礎,構建多字段的match查詢。

  參數:

  1.query:查詢文本。

  2.fields:查詢字段,支持多個字段,最多查詢字段數由indices.query.bool.max_clause_count定義,默認為1024個。

  3.type:查詢的類型。

    best_fields:查找匹配任意field的文檔,但是文檔的得分來自最匹配的那個字段。

    most_fields:組合所有字段的得分,作為文檔的評分。

    cross_fields:將多個字段組合成一個字段,在組合成的字段里去查詢。

    phrase:每個字段以match_phrase方式查詢,使用最匹配字段的得分作為文檔的評分。

    phrase_prefix:每個字段以match_phrase_prefix方式查詢,,使用最匹配字段的得分作為文檔的評分。

    bool_prefix:每個字段以match_bool_prefix方式查詢,組合所有字段的得分作為文檔的評分。

  4.tie_breaker:當使用tie_breaker時,best_field會根據tie_breaker定義的值的大小,決定除最佳匹配字段得分以外其他字段的得分。為tie_breaker * (其他字段_score)之和。

    5.其他參數:analyzer, boost, operator, minimum_should_match, fuzziness, lenient, prefix_length, max_expansions, rewrite, zero_terms_query, cutoff_frequency, auto_generate_synonyms_phrase_query and fuzzy_transpositions。

 

GET /test/_search
{
  "explain": true, 
  "query": {
    "multi_match" : {
      "query":      "brown fox",
      "type":       "best_fields",
      "fields":     [ "title", "body" ]
    }
  }
}
GET /_search
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "cross_fields",
      "fields":     [ "first_name", "last_name" ],
      "operator":   "and"
    }
  }
}

這個查詢類似與:
(+first_name:will +first_name:smith) | (+last_name:will  +last_name:smith)
所有的搜索詞項都必須在單獨的字段(也可以是多個字段組合成的單個字段,如first_name+last_name)中出現。

 2.6Common Terms Query

  使用語法基於操作符如:AND OR來解析和分割查詢字符串,然后用分析器對分割的部分就行分析,並與文檔進行匹配。

  參數:

  1.query:查詢字符串。

  2.default_field:當query_string沒有指定查詢字段時候,默認查詢的字段。默認值為索引設定的index.query.default_field值,index.query.default_field默認值為*。

  3.allow_leading_wildcard:true的時候,通配符*,?可以被作為查詢字符串的首個字符。默認為true。

  4.analyze_wildcard:true的時候,查詢會分析查詢字符串中的通配符。

  5.analyzer:用於分析查詢字符串的分析器,默認為文檔索引時候的分析器。

  6.auto_generate_synonyms_phrase_query:true的時候,自動創建多同義詞查詢。

  7.boost:浮點數用於增加或減少查詢的相關度評分。

  8.default_operator:如果沒有定義operator,默認被用作解析查詢字符串的操作符。OR(默認)

  9.enable_position_increments:

  10.fields:希望查詢的字段的集合。

  11.模糊匹配相關:fuzziness,fuzzy_max_expansions模糊匹配最大擴展數,fuzzy_prefix_length模糊匹配前綴數,fuzzy_transpositions,lenient。

  12.max_determinized_states:確定一個查詢需要的最大的自動機的數量。解釋:https://www.jianshu.com/p/9edca9474663?utm_source=desktop&utm_medium=timeline

  13.minimum_should_match:返回的文檔最少匹配查詢條件的程度。

  14.quote_analyzer:用於分析在引號中的查詢文本。

  15.phrase_slop:匹配的兩個分詞之間間隔的最大詞項數。

  16.quote_field_suffix:附加到引號查詢文本的后綴。

  17.rewrite:用於重寫查詢的方法。

  18.time_zone:時區,用於轉換日期參數。

2.7Simple Query String

  返回匹配查詢字符串的文檔,使用有限制的但是容錯的語法去解析查詢字符串。該查詢使用簡單的語法基於操作符去解析和分割查詢字符串,在查詢之前分別分析各個詞項。因為對語法有更多的限制,索引當有不合規的語法時不會返回錯誤,忽略查詢字符串中不合法的部分。

  參數:

  1.Query:搜索內容。

  2.Fields:搜索的字段集合。

  3.default_operator:如果沒有定義operator,默認被用作解析查詢字符串的操作符。OR(默認)

  4.analyze_wildcard:true的時候,查詢會分析查詢字符串中的通配符。

  5.analyzer:用於分析查詢字符串的分析器,默認為文檔索引時候的分析器。

  6.auto_generate_synonyms_phrase_query:true的時候,自動創建多同義詞查詢。

  7.flags:查詢操作可以使用的操作符列表。合法操作符:AND、ESCAPE、FUZZY、NEAR、NONE、NOT、OR、PHRASE、PRECEDENCE、PREFIX、SLOP、WHITESPACE。

  8.其他參數:fuzzy_max_expansions、fuzzy_prefix_length、fuzzy_transpositions、lenient、minimum_should_match、quote_field_suffix。

3.詞條查詢-Term Query

  詞條查詢是基於文檔值精確匹配的查詢,比如說日期、IP地址,價格,物品ID等;和全文檢索不一樣,詞條查詢不對搜索詞項進行分析,詞條查詢匹配字段中存儲的真實值。

3.1.Exits Query

  返回字段索引值不為空的文檔。

  字段索引值為空的原因:字段在源數據中是null或者[];字段配置了index:false屬性;字段值的長度超過了ignore_above配置值;字段值格式不對,而且定義了ignore_malformed(忽略格式不對的值)。

  參數:

  field:想要查詢的字段。

GET /test/_search
{
    "query": {
        "exists": {
            "field": "body"
        }
    }
}

3.2.Fuzzy Query

  返回文檔中詞項與搜索詞項相似的文檔。

  參數:

  頂層參數:field,想要查詢的字符串。

  field的參數:

  1.value:想要在field中查詢到的值。

  2.fuzziness:通常被解釋為萊文斯坦距離也叫做Edit Distance,指的是一個詞與另一個詞匹配需要編輯的次數,編輯操作替換字符,插入字符,刪除字符,需要編輯的次數越多,說明Edit Distance越大。fuzziness的參數:0,1,2表示最大的編輯次數,默認為AUTO參數,表示根據term的長度自動生成編輯次數。

  3.max_expansions:模糊規則最大的擴展數,默認為50。

  4.prefix_length:fuzzy匹配時,保持不變的字符前綴數,默認為0。

  5.transpositions:如果true,那么fuzzy匹配允許字符交換位置,ab->ba。

  6.rewrite:重寫查詢的方法。

3.3.IDs

  基於IDs返回文檔,使用存儲在_id字段中的IDs。

GET /test/_search
{
    "query": {
        "ids" : {
            "values" : ["1", "4", "5"]
        }
    }
}

3.4.Prefix Query

  返回字段值以查詢值為前綴的文檔。

  參數:field,field的參數(value,rewrite)

GET /test/_search
{
    "query": {
        "prefix": {
            "body": {
                "value": "bro"
            }
        }
    }
}

3.5.Range Query

  返回包含詞項在提供的范圍內的文檔。

  參數:

  頂層參數,field,想要查詢的參數。

  field的參數:

    1.gt 大於。

    2.gte 大於等於。

    3.lt 小於。

    4.lte 小於等於。

    5.format 用於轉化日期的格式。

    6.relation 表示范圍查詢如何匹配range類型的字段值。

      INTERSECTS:返回range字段值和查詢范圍相交的文檔。(默認)

      CONTAINS:返回range字段值匹配完全包含查詢范圍的文檔。

      WITHIN:返回range字段值完全在查詢范圍內的文檔。

    7.time_zone:查詢UTC時間時,用於將查詢時間轉換為UTC時間的偏移量。

    8.boost:浮點數用於增加或減少查詢的相關度評分。

  測試一下range字段的搜索,range field有以下六種類型:integer_range、float_range、long_range、double_range、date_range、ip_range

PUT range_index
{
  "mappings": {
    "properties": {
      "integer_range_test": {
        "type": "integer_range"
      },
      "float_range_test": {
        "type": "float_range"
      },
      "long_range_test": {
        "type": "long_range"
      },
      "double_range_test": {
        "type": "double_range"
      },
      "date_range_test": {
        "type": "date_range",
        "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"
      },
      "ip_range_test": {
        "type": "ip_range"
      }
    }
  }
}

 插入數據:

PUT range_index/_doc/1
{
  "integer_range_test" : { 
    "gte" : 10,
    "lte" : 20
  },
  "date_range_test" : { 
    "gte" : "2015-11-01", 
    "lte" : "2015-11-30"
  },
  "ip_range_test":{
    "gte" : "255.255.1.1",
    "lte" : "255.255.1.255"
  }
}
GET /range_index/_search
{
    "query": {
        "range" : {
            "integer_range_test" : {
                "gte" : 5,
                "lte" : 15,
                "relation":"INTERSECTS" //[5,15]和[10,20]相交,返回一條結果
            }
        }
    }
}
GET /range_index/_search
{
    "query": {
        "range" : {
            "ip_range_test" : {
                "gte" : "255.255.1.10",
                "lte" : "255.255.1.220",
                "relation":"CONTAINS" //[255.255.1.1,255.255.1.255]完全包含[255.255.1.10,255.255.1.220] 返回一條記錄
            }
        }
    }
}
GET /range_index/_search
{
    "query": {
        "range" : {
            "date_range_test" : {
                "gte" : "2015-10-15",
                "lte" : "2015-12-15",
                "relation":"WITHIN" //[2015-11-01,2015-11-30]在[2015-10-15,2015-12-15]之內,返回一條記錄
            }
        }
    }
}

3.5.Regexp Query

  返回詞項匹配查詢正則表達式的文檔。

  參數:

  頂層參數:field想要查詢的字段。

  field的參數:

    1.value:想要查詢的正則表達式。默認正則表達式限制在1000個字符,可以通過index.max_regex_length改變該值。

    2.flags:可以使用flag參數讓正則查詢能夠使用除標准正則表達式外可選的正則表達式符號。使用多個正則表達式符號,使用|分割;flag的值:ALL-可以使用所有的操作符,COMPLEMENT-可以使用~符號,~表示非操作;INTERVAL-可以使用<>符號,表示匹配一個數值的范圍;INTERSECTION:可以使用&符號,表示與操作;ANYSTRING-可以使用@符號,表示匹配整個字符串。

    3.max_determinized_states:確定一個查詢需要的最大的自動機的數量。使用此參數防止查詢中消耗太多資源,當有復雜正則表達式時需要增加這個數量。

    4.rewrite:重寫查詢的方法。

 3.6.Term Query

  返回字段值中准確包含查詢詞項的文檔。

  參數:

    頂層參數:field想要查詢的字段。

    1.value:想要在field字段中查詢到的值。查詢值必須准確匹配文檔中字段的值。

    2.boost:用於增加或減少查詢的相關度評分。     

GET /test/_search
{
    "query": {
        "term": {
            "body": {
                "value": "fox"
            }
        }
    }
}

  注:避免使用term查詢查詢text類型的字段,因為默認情況下,es分析器會改變text類型字段的值,如標准分析器將會對text類型字段進行如下的改動:

  1).去除大部分的標點符號

  2).將內容分割為不同的分詞

  3).將分詞最小化

  所以搜索text類型字段時,推薦使用match query,match query會將在查詢之前會將查詢內容進行分析,可以較好的匹配經過分析后的text類型字段的內容。

3.7.Terms Query

  返回字段值中包含一個或多個准確詞項的文檔。

  參數:

  1.field:想要查詢的字段,該參數的值是想要搜索的詞項的數組。默認es限制最大可以查詢65,536個詞,可以通過index.max_terms_count設置該限制。

  2.boost:用於增加或減少查詢的相關度評分。

  Terms lookup:

  Terms lookup提取某個文檔的字段值,作為查詢的詞項數組,適合於搜索詞項數組很大的情況;mapping的_source必須設置為enabled:true。

  Terms lookup的參數:

  1.index:提取字段值的索引。

  2.ID:想要提取字段值的文檔的ID。

  3.path:提取值的字段。ES使用這個值去做terms query。

  4.rounting:如果文檔索引時有routing值,那么抓取文檔值時需要提供routing value,去定位文檔位置。   

GET my_index/_search?pretty
{
  "query": {
    "terms": {
        "color" : {
            "index" : "my_index",
            "id" : "2",   //提取文檔id為2的color字段的值,將其作為term query的查詢值去搜索
            "path" : "color" 
        }
    }
  }
}

3.8.Terms Set Query

  Terms Set Query和terms query類似,但是Terms Set Query可以定義放回的文檔需要有多少個匹配的詞項。  

  大多數情況下,terms set query需要在索引中包含一個數值型的字段,這個數值型的字段存放返回文檔需要匹配的詞項數。

  參數:

    頂層參數:field想要查詢的字段。

    field的參數:

    1.terms:想要在field字段中查找到的詞項數組,詞項必須和文檔字段內容精確匹配。

    2.minimum_should_match_field:指定文檔返回需要匹配的詞項數量的字段。

    3.minimum_should_match_script:自定義腳本指定文檔返回需要匹配的詞項數量。

PUT /job-candidates
{
    "mappings": {
        "properties": {
            "name": {
                "type": "keyword"
            },
            "programming_languages": {
                "type": "keyword"
            },
            "required_matches": { //存放返回文檔需要匹配的詞項數
                "type": "long"
            }
        }
    }
}
PUT /job-candidates/_doc/1?refresh
{
    "name": "Jane Smith",
    "programming_languages": ["c++", "java"],
    "required_matches": 2 //返回該文檔需要匹配兩個詞項
}
GET /job-candidates/_search
{
    "query": {
        "terms_set": {
            "programming_languages": {
                "terms": ["c++", "java", "php"],
                "minimum_should_match_field": "required_matches"
            }
        }
    }
}

3.9.Wildcard Query

  返回內容匹配查詢通配符的文檔。

  參數:

    頂層參數:field想要查詢的字段。

    field的參數:

    1.value:用來匹配field字段值的通配符表達式。支持兩種通配符:?匹配一個任意的字符,*匹配0個或多個任意字符。

    2.boost。

    3.rewrite。


免責聲明!

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



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