1. 程式人生 > >Elasticsearch基本語法

Elasticsearch基本語法

match和match_phrase區別

match: 索引中只要有任意一個匹配拆分後詞就可以出現在結果中,只是匹配度越高的排越前面

match_phrase: 索引中必須同時匹配拆分後詞就可以出現在結果中

ex:

GET /product_index/product/_search
{
  "query": {
    "match_phrase": {
      "product_name": "PHILIPS toothbrush"
    }
  }
}

product_name必須同時包含PHILIPS和toothbrush才會返回。

 

match的另一些用法

滿足分詞結果中所有的詞,而不是像上面,任意一個就可以的。

GET /product_index/product/_search
{
  "query": {
    "match": {
      "product_name": {
        "query": "PHILIPS toothbrush",
        "operator": "and"
      }
     }
   }
}

 只要命中50%的分詞就返回

GET /test_index/test/_search
{
  "query": {
    "match": {
      
"product_name": { "query": "java 程式設計師 書 推薦", "minimum_should_match": "50%" } } } }

multi_match: 查詢a和b欄位中,只要有c關鍵字的就出現

GET /test_index/test/_search
{
  "query": {
    "multi_match": {
      "query": "c",
      "fields": [
        "a",
        "b"
      ]
    }
  }
}

multi_match 跨多個 field 查詢,表示查詢分詞必須出現在相同欄位中

GET /product_index/product/_search
{
  "query": {
    "multi_match": {
      "query": "PHILIPS toothbrush",
      "type": "cross_fields",
      "operator": "and",
      "fields": [
        "product_name",
        "product_desc"
      ]
    }
  }
}

 

match_phrase + slop

  • 在說 slop 的用法之前,需要先說明原資料是:大吉大利,被分詞後至少有:大 吉 大 利 四個 term。
  • match_phrase 的用法我們上面說了,按理說查詢的詞必須完全匹配才能查詢到,吉利 很明顯是不完全匹配的。
  • 但是有時候我們就是要這種不完全匹配,只要求他們儘可能靠譜,中間有幾個單詞是沒啥問題的,那就可以用到 slop。slop = 2 表示中間如果間隔 2 個單詞以內也算是匹配的結果()。
  • 實也不能稱作間隔,應該說是移位,查詢的關鍵字分詞後移動多少位可以跟 doc 內容匹配,移動的次數就是 slop。所以 吉利 其實也是可以匹配到 doc 的,只是 slop = 1 才行。
    GET /product_index/product/_search
    {
      "query": {
        "match_phrase": {
          "product_name" : {
              "query" : "吉利",
              "slop" : 1
          }
        }
      }
    }

     

 

range用法

range用於查詢數值,時間區間

GET /product_index/product/_search
{
  "query": {
    "range": {
      "price": {
        "gte": 30.00
      }
    }
  }
}