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 更新文件
更新文件有兩種,全量修改和增量修改
- 全量修改,是將原來的文件刪除,然後增加一個相同id的文件,寫法與新增文件相同
- 增量修改。如下,這裡的更新欄位只會匹配原來文件中已存在的欄位。
POST /索引名/_doc/索引id/_update
{
"doc": {
"更新欄位": "更新內容"
}
}
3. 查詢文件
term&terms查詢
term
和 terms
查詢用於查詢與指定值完全匹配的文件,精確匹配,通常用於非分析欄位(如 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>"
}
}