ElasticSearch restful語法

Liang2003發表於2024-11-16

ElasticSearch基礎學習

1. Elasticsearch 的基本概念

  • Index(索引):相當於資料庫中的表,儲存一類文件。
  • Document(文件):索引中的一條記錄,使用 JSON 格式表示。
  • Type(型別):文件的分類,Elasticsearch 7.x 之後已不再推薦使用。
  • Field(欄位):文件中的鍵值對。

2. 常用的 CRUD 操作

2.1 建立索引

PUT /my_index
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 1
  },
  "mappings": {
    "properties": {
      "title": { "type": "text" },
      "date": { "type": "date" },
      "content": { "type": "text" }
    }
  }
}

注意:一旦建立索引庫,對應的mapping結構不能修改,但是可以新增新的欄位,以下是新增新欄位操作:

PUT /索引庫名/_mapping
{
  "properties": {
    "新欄位名":{
      "type": ""
    }
  }
}

每個欄位的子屬性有以下幾種:

type:欄位資料型別,常見的簡單型別有:
字串:text(可分詞的文字)、keyword(精確值,例如:品牌、國家、ip地址)
數值:long、integer、short、byte、double、float
布林:boolean
日期:date
物件:object
index:是否建立索引(即倒排索引),預設為true(可參與搜尋)
analyzer:使用哪種分詞器(跟text型別結合使用)
properties:該欄位的子欄位

2.2 新增文件

POST /my_index/_doc/1
{
  "title": "My First Document",
  "date": "2023-10-01",
  "content": "This is the content of the document."
}

2.3 獲取文件

GET /索引名/_doc/文件id

2.4 刪除文件

DELETE /索引名/_doc/文件id

2.5 更新文件

更新文件有兩種,全量修改和增量修改

  1. 全量修改,是將原來的文件刪除,然後增加一個相同id的文件,寫法與新增文件相同
  2. 增量修改。如下,這裡的更新欄位只會匹配原來文件中已存在的欄位。
POST /索引名/_doc/索引id/_update
{
  "doc": {
  	"更新欄位": "更新內容"
  }
}

3. 查詢文件

term&terms查詢

termterms 查詢用於查詢與指定值完全匹配的文件,精確匹配,通常用於非分析欄位(如 keyword 型別或數值型別)。

POST /索引庫/_search
{
  "query": {
    "term": {
      "field_name": "value"
    }
  }
}

terms 查詢允許你指定多個值,匹配欄位中的任何一個值。它用於查詢包含任意指定值之一的文件。

POST /索引庫/_search
{
  "query": {
    "terms": {
      "field_name": ["value1", "value2", "value3"]
    }
  }
}

match查詢

match本質是多個term查詢的上層封裝。match會識別欄位型別,如果是可以分詞的("text")就採用分詞方式查詢,如果是不分詞("keyword"或數值型別)就採用精確匹配。

查詢所有

POST /test/_search
{
  "query": {
    "match_all": {}
  }
}

對於普通的match,match中欄位常用的屬性。

"query": 需要匹配的內容,
"operator": 是OR匹配還是AND匹配
"fuzziness": "AUTO" 模糊查詢,允許一定的拼寫錯誤
POST /test/_search
{
  "query": {
    "match": {
      "field": "Second content"
    }
  }
}

上面的是預設寫法,如果不做其他要

multi_match

多個欄位匹配同一內容

POST /test/_search
{
  "query": {
    "multi_match": {
      "query": "content",
      "fields": [field1,field2]
    }
  }
}

其他查詢

prefix查詢

fuzzy模糊查詢,

wildcard通配查詢(相當於Mysql的like查詢,可以加萬用字元),

range範圍查詢,只針對數值型別

regexp正規表示式查詢

深分頁

ES對用from+size這種方法的查詢是有限制的,兩者之和不能超過10000,所以要使用Scroll。

  • from + size: 適合小資料集的簡單分頁。
  • Scroll: 適合大資料集的批次處理,且效能更優。

複合查詢

將多個條件組合起來

must : 在裡面的條件都要滿足,相當於and

must_not: 在裡面的條件都不要滿足,相當於not

should:在裡面的條件滿足其中一個,相當於or

# 班級為1,2,3中總分為100分的且家鄉在北京的人
POST /test/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "class":1
        },
        {
          "class":2
        },
        {
          "class":3
        }
      ],
      "must": [
        {
          "total_score" : 100
        },
        {
          "city": "beijing"
        }
      ]
    }
  }
}

高亮查詢

POST /test/_search
{
  "query": {
    "match": {
      "content": "content"
    }
  },
  "highlight": {
    "fields": {
      "content": {}
    },
    "pre_tags": "<font color='red'>", 
    "post_tags": "</font>"
  }
}

相關文章