elasticsearch 基礎操作

小宇渣渣渣發表於2020-04-04

mapping 操作

指定mapping, 建立一個index

PUT /test_user2
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  }, 
  "mappings": {
    "properties": {
      "name":{
        "type":"keyword"
      }
    }
  }
}
複製程式碼

我們系統執行一段時間後, 想增加一個地址的欄位, 如何手動指定型別呢?

在已有index mapping中新增新型別

PUT /test_user2/_mapping
{
  "properties": {
      "address":{
        "type":"text",
        "index": false  //禁止被檢索
      }
    }
}
複製程式碼

index 模版建立

//設定模版-型別推斷為int
PUT /_template/template_1
{
  "index_patterns": ["user*"],
  "order":1,
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "numeric_detection": true
  }
}


//獲取模版資訊
GET /_template/template_1
複製程式碼

mapping dynamic 屬性

在mapping中我們還可以設定 dynamic 屬性

dynamic 可以分為動態對映(dynamic mapping)和靜態(顯式)對映(explicit mapping)和精確(嚴格)對映(strict mappings),具體由dynamic屬性控制。

  • 動態對映(dynamic:true) 自動建立自動索引

  • 靜態對映(dynamic:false)可以存進去 但不能檢索

  • 嚴格模式(dynamic:false)如果遇到新的欄位,就丟擲異常

聚合統計分析

GET /test_users/_search
{
  "size": 0,
  "aggs": {
    "age_agg":{
      "terms": {
        "field": "age",
        "size": 10
      },
      "aggs": {
        "constom_a":{
          "sum": {
            "field": "age"
          }
        }
      }
    }
  }
}
複製程式碼

上面首先根據age進行分組, 在組內對age進行求和.

分詞檢測

檢測分詞情況
GET /_analyze
{
  "analyzer": "standard",
  "text":"Waiting to Exhale (1995)"
}


//檢視test_users索引的name欄位怎樣分詞, 預設為standard
GET /test_users/_analyze
{
  "field":"name",
  "text":"hello world 中國"
}
複製程式碼

更新

//建立一個document, 如果存在則更新(不推薦)
POST /test_users/create/1
{
  "name":"xiaoyu",
  "age": 22,
  "address":"河北保定"
}

//只能新增, 否則報錯
POST /test_users/_doc/3?op_type=create
{
  "name":"wansan",
  "age": 33,
  "address":"河北保定"
}

//建立或更新(推薦)
PUT /test_users/_doc/2
{
  "name":"linlin",
  "age": 22,
  "address":"河北保定"
}

//更新-覆蓋掉舊資料
PUT /test_users/_doc/2
{
  "sex":"女"
}


//將sex加入到原文件中(只更新指定的欄位)
POST /test_users/_update/2
{
  "doc":{
    "sex":"女"
  }
}
複製程式碼

查詢

url 模糊查詢

//查詢欄位中包含關鍵詞的資料
GET /test_users/_search?q=河北

//查詢_id=1的資料
GET test_users/_doc/1
複製程式碼

dsl方式查詢

模糊查詢Waiting 和 Exhale

GET xiaoyu_movie/_search
{
  "query": {
    "match": {
      "column2": "Waiting Exhale",
    }
  }
}
複製程式碼

elasticsearch 基礎操作

但是這不是我們想要的結果, 我們想同時包含這兩個單詞

當然你會想到拆分多條件查詢

GET xiaoyu_movie/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match":{
            "column2": "Waiting"
          }
        },
        {
          "match":{
            "column2": "Exhale"
          }
        }
      ]
    }
  }
}
複製程式碼

這裡我們使用一種更簡便的方式

GET xiaoyu_movie/_search
{
  "profile": "true",   
  "explain": true, //開啟查詢分析
  "query": {
    "match": {
      "column2":{
        "query": "Waiting Exhale",
        "operator": "AND"
      }
    }
  }
}
複製程式碼

或者使用

GET xiaoyu_movie/_search
{
  "profile": "true", 
  "explain": true, 
  "query": {
    "match": {
      "column2":{
        "query": "Waiting Exhale",
        "minimum_should_match": 2
      }
    }
  }
}
複製程式碼

優化 (使用 constant_score filter 遮蔽評分):

GET xiaoyu_movie/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "match": {
          "column2": {
            "query": "Waiting Exhale",
            "minimum_should_match": 2
          }
        }
      }
    }
  }
}
複製程式碼

如果想要提升某個子句的排序權重, 可以設定 boost

GET /xiaoyu_movie/_search
{
  "query": {
    "match": {
      "column2":{
        "query": "a",
        "boost": 2
      }
    }
  }
}
複製程式碼

如果想對某個條件提升或降低權重, 可以使用boost, 預設為1.

OR 查詢

GET /xiaoyu_movie/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "column1": {
              "value": "2376"
            }
          }
        },
        {
          "term": {
            "column1": {
              "value": "1"
            }
          }
        }
      ],
      "minimum_should_match": 1 //預設為1,表示最少滿足一個條件
    }
  }
}
複製程式碼

多欄位相同查詢, 匹配度20%

GET /xiaoyu_movie/_search
{
  "query": {
    "multi_match": {
      "query": "a b c",
      "fields": ["column1","column2"],
      "minimum_should_match": "20%"
    }
  }
}
複製程式碼

相關文章