基本操作
創(chuàng)建不同的分詞器
ik_smart: 極簡(jiǎn)分詞 ; ik_max_word: 最細(xì)力再度分詞
基本的rest命令
method | url地址 | 描述 |
---|---|---|
PUT | localhost:9200/索引名稱/類型名稱/文檔id | 創(chuàng)建文檔(指定文檔id) |
POST | localhost:9200/索引名稱/類型名稱 | 創(chuàng)建文檔(隨機(jī)文檔id) |
POST | localhost:9200/索引名稱/類型名稱/文檔id/_update | 修改文檔 |
DELETE | localhost:9200/索引名稱/類型名稱/文檔id | 刪除文檔 |
GET | localhost:9200/索引名稱/類型名稱/文檔id | 查詢文檔通過文檔id |
POST | localhost:9200/索引名稱/類型名稱/_search | 查詢所有數(shù)據(jù) |
索引基本操作
查詢所有索引
Elasticsearch 7.x 版本
# 返回一個(gè)僅包含索引名稱的 JSON 數(shù)組 ?
GET /_cat/indices?format=json&h=index
擴(kuò)展:獲取ES的其他信息
GET _cat/health ? ? ?# 查看健康值 ?
GET _cat/indices?v ?#查看所有東西的版本信息
新增索引
?# ElasticSearch的7.x.x版本 ?PUT /索引名/類型名/文檔id ?{ ?請(qǐng)求體 ?}?# 創(chuàng)建索引
??PUT test1 ?{ ?"mappings": { ?"properties": { ??"name": { ????"type": "text" ??}, ??"age":{ ????"type": "integer" ??} ?} ?} ?}
?# 創(chuàng)建加索引時(shí)同時(shí)添加數(shù)據(jù),es會(huì)自動(dòng)給屬性設(shè)置type ?# ElasticSearch的8.x.x版本,類型已經(jīng)棄用,默認(rèn)寫_doc。 ?PUT /索引名/_doc/文檔id ?{ ?請(qǐng)求體 ?} ?? ?PUT test1/_doc/1 ?{ ?"name":"小明", ?"age":23 ?}?# ElasticSearch的8.x.x版本,類型已經(jīng)棄用,默認(rèn)寫_doc。 ?PUT /索引名/_doc/文檔id ?{ ?請(qǐng)求體 ?}
?CreateIndexRequest request = new CreateIndexRequest(INDEX);
?CreateIndexResponse response = client.indices().create(request, RequestOptions.DEFAULT);
查看索引
name需要指定類型
官網(wǎng)類型文檔地址:Keyword type family | Elasticsearch Guide [8.9] | Elastic
字符串類型 text、keyword
數(shù)值類型 long,integer,short,byte,double,float,half float,scaled float
日期類型 date
te布爾值類型 boolean·
二進(jìn)制類型 binary
等等……
設(shè)置字段類型
修改索引
索引是不可修改的。一旦創(chuàng)建了索引,您不能直接修改其結(jié)構(gòu)或字段的映射。如果要修改索引的結(jié)構(gòu),您需要重新創(chuàng)建索引并重新索引數(shù)據(jù)。
?POST _reindex ?{ ?"source": { ? "index": "your_old_index" ?}, ?"dest": { ? "index": "new_index" ?} ?}
新索引和舊索引的字段不一定需要完全一致。在重新創(chuàng)建索引和重新索引數(shù)據(jù)時(shí),可以對(duì)字段進(jìn)行修改、刪除或添加新的字段。
如果字段在新索引中已經(jīng)存在,則該字段的映射將被保留。如果字段在新索引中不存在,則會(huì)根據(jù)重新索引的數(shù)據(jù)動(dòng)態(tài)創(chuàng)建字段的映射。
例如,假設(shè)舊索引中有一個(gè) "field1" 字段,而新索引中沒有。在重新索引數(shù)據(jù)時(shí),如果數(shù)據(jù)中存在 "field1" 字段,Elasticsearch 將自動(dòng)創(chuàng)建該字段的映射并將其添加到新索引中。
同樣地,如果舊索引中存在一個(gè) "field2" 字段,而新索引中也有一個(gè)名為 "field2" 的字段,那么在重新索引數(shù)據(jù)時(shí),新索引中的 "field2" 字段的映射將保留不變。
需要注意的是,如果字段在新索引和舊索引中具有不兼容的類型或映射定義,可能會(huì)導(dǎo)致數(shù)據(jù)轉(zhuǎn)換或丟失。因此,在進(jìn)行索引結(jié)構(gòu)修改時(shí),請(qǐng)確保對(duì)數(shù)據(jù)和字段映射的變化有充分的了解和計(jì)劃。
刪除索引
關(guān)于文檔的基本操作
基本操作
添加數(shù)據(jù)
PUT /index/_doc/1
{
"name": "狂神說",
"age": 3,
"desc": "工資2500",
"tags": ["直男","溫暖","技術(shù)宅"]
}
PUT /index/_doc/2
{
"name": "張三",
"age": 30,
"desc": "沒有工資",
"tags": ["渣男","旅游","交友"]
}
查詢數(shù)據(jù)
# 查詢索引下,對(duì)應(yīng)文檔ID的數(shù)據(jù) GET /index/_doc/1 GET /index/_doc/2
更新 PUT(不推薦)
PUT 修改數(shù)據(jù),需要全屬性字段都存在,否則會(huì)丟失缺失的屬性字段
# 修改數(shù)據(jù)
put index/_doc/1
{
"name": "楊光1",
"age": 3,
"desc": "工資2500",
"tags": ["直男","溫暖","技術(shù)宅"]
}
# PUT 修改時(shí),會(huì)更新該ID下的所有字段,如果缺失字段,則會(huì)刪除原有字段
put index/_doc/1
{
"name": "楊光1",
"age": 3,
"desc": "工資2500"
}
更新 POST(推薦)
# POST 更新,會(huì)修改該文檔ID下對(duì)應(yīng)屬性的值 POST index/_update/1 { "doc": { "name":"楊光3" } }
# POST 更新,會(huì)修改該文檔ID下對(duì)應(yīng)屬性的值,不推薦這樣寫,ES8執(zhí)行不支持這種語法
POST index/_doc/1/_update
{
"doc": {
"name":"楊光4"
}
}
?
條件查詢
PUT /index/_doc/1
{
"name": "楊光",
"age": 3,
"desc": "工資2500",
"tags": ["直男","溫暖","技術(shù)宅"]
}
PUT /index/_doc/2
{
"name": "張三",
"age": 30,
"desc": "沒有工資",
"tags": ["渣男","旅游","交友"]
}
# 根據(jù)name查詢
GET index/_search?q=name:張三
PUT index
{
"mappings": {
"properties": {
"name":{
"type": "keyword"
},
"xm":{
"type": "text",
"analyzer": "ik_smart"
},
"age":{
"type": "integer"
},
"desc":{
"type": "text"
},
"tags":{
"type": "text"
}
}
}
}
# 測(cè)試數(shù)據(jù)
PUT /index/_doc/1
{
"name": "楊光",
"xm": "楊光",
"age": 3,
"desc": "工資2500",
"tags": ["直男","溫暖","技術(shù)宅"]
}
PUT /index/_doc/2
{
"name": "張三",
"xm": "張三",
"age": 30,
"desc": "沒有工資",
"tags": ["渣男","旅游","交友"]
}
PUT /index/_doc/3
{
"name": "李三",
"xm": "李三",
"age": 23,
"desc": "工資5000",
"tags": ["健身","旅游","購物"]
}
PUT /index/_doc/4
{
"name": "張三豐",
"xm": "張三豐",
"age": 10,
"desc": "工資5000",
"tags": ["健身","旅游","購物"]
}
PUT /index/_doc/5
{
"name": "張",
"xm": "張",
"age": 10,
"desc": "工資5000",
"tags": ["健身","旅游","購物"]
}
PUT /index/_doc/6
{
"name": "三",
"xm": "三",
"age": 10,
"desc": "工資5000",
"tags": ["健身","旅游","購物"]
}
match和term
Match查詢和Term查詢是Elasticsearch中常用的查詢類型,它們有以下區(qū)別:
匹配方式:
Term查詢:對(duì)查詢條件不進(jìn)行分詞,直接按照完全匹配的方式進(jìn)行查詢。
Match查詢:對(duì)查詢條件進(jìn)行分詞,然后對(duì)分詞后的詞項(xiàng)進(jìn)行匹配。
查詢字段類型:
Term查詢:適用于精確匹配的字段,如關(guān)鍵字(keyword)類型或未分詞的文本類型(如"張三",不會(huì)被分詞)。
Match查詢:適用于全文本字段,如全文本(text)類型或已分詞的文本類型(如"張三 張三",會(huì)被分詞成兩個(gè)詞項(xiàng)"張三")。
匹配精度:
Term查詢:精確匹配,只有完全匹配的詞項(xiàng)才會(huì)被返回。
Match查詢:默認(rèn)為詞項(xiàng)級(jí)別的匹配,可以根據(jù)分析器的分詞規(guī)則進(jìn)行模糊匹配。
執(zhí)行效率:
Term查詢:由于不進(jìn)行分詞,查詢速度較快。
Match查詢:需要對(duì)查詢條件進(jìn)行分詞,可能會(huì)影響查詢性能。
根據(jù)具體的查詢需求,選擇合適的查詢類型可以提高查詢的準(zhǔn)確性和效率。如果需要精確匹配的查詢,且不需要分詞,可以選擇Term查詢;如果需要對(duì)分詞后的文本進(jìn)行匹配,可以選擇Match查詢。
match查詢
# match 查詢時(shí),會(huì)對(duì)查詢條件先分詞
# 而name字段類型為keyword,不會(huì)分詞,所以只能搜到name=張三的數(shù)據(jù)
GET index/_search
{
"query": {
"match": {
"name": "張三"
}
},
"_source": ["name","xm"]
}
# match 查詢,會(huì)對(duì)查詢條件先分詞
# xm字段類型為text,用ik_max_smart分詞,會(huì)分詞,所以只能搜到文檔xm字段分詞后,結(jié)果為張三分詞后的所有數(shù)據(jù)
GET index/_search
{
"query": {
"match": {
"xm": "張三"
}
},
"_source": ["name","xm"]
}
?
term查詢
# term 查詢時(shí),不會(huì)對(duì)查詢條件進(jìn)行分詞,name為keyword,所以只能完全匹配
GET index/_search
{
"query": {
"term": {
"name": "張三"
}
}
}
# term 查詢,不會(huì)對(duì)查詢條件進(jìn)行分詞
# xm字段類型為text,用ik_max_smart分詞,會(huì)分詞,所以能查到文檔分詞后為張三的數(shù)據(jù)
GET index/_search
{
"query": {
"term": {
"xm": "張三"
}
},
"_source": ["name","xm"]
}
?
過濾字段查詢
# 查詢結(jié)果只展示 name和xm兩個(gè)字段
GET index/_search
{
"_source": ["name","xm"]
}
排序
# 查詢結(jié)果排序
GET index/_search
{
"_source": ["name", "age"],
"sort": [
{
"age": {
"order": "desc"
}
}
]
}
分頁查詢
# 分頁查詢
GET index/_search
{
"_source": ["name", "age"],
"from": 0,
"size": 2
}
多條件查詢(布爾值查詢)
must
類似sql中的 and
# 查詢 name = 張三 并且 age = 30
GET index/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"name": "張三"
}
},
{
"match": {
"age": "30"
}
}
]
}
}
}
should
類似sql中的 or
# 查詢 name = 張三 或者 name = 李三
GET index/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name": "張三"
}
},
{
"match": {
"name": "李三"
}
}
]
}
}
}
must_not
類似sql中的 not in
# 查詢 name != 張三 并且 name != 李三
GET index/_search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"name": "張三"
}
},
{
"match": {
"name": "李三"
}
}
]
}
}
}
filter
在Elasticsearch中,過濾器(Filter)是一種用于精確篩選文檔的查詢子句,主要用于限制搜索結(jié)果的范圍。與查詢(Query)不同,過濾器不會(huì)評(píng)分和排序結(jié)果,而是根據(jù)指定的條件進(jìn)行篩選。這可以提高查詢性能,特別是在過濾大量文檔的情況下。
過濾器可以用于各種條件,如范圍查詢、存在性檢查、邏輯運(yùn)算等。常見的過濾器類型包括:
Term Filter:根據(jù)指定的詞項(xiàng)進(jìn)行精確匹配篩選。
Range Filter:通過指定的范圍進(jìn)行篩選,可以用于數(shù)值、日期等字段。
Exists Filter:檢查字段是否存在于文檔中。
Bool Filter:通過邏輯運(yùn)算符(AND、OR、NOT)對(duì)其他過濾器進(jìn)行組合。
Geo Distance Filter:通過指定的地理位置和距離范圍進(jìn)行地理位置過濾。
Script Filter:使用自定義腳本進(jìn)行篩選。
過濾器可以單獨(dú)使用,也可以與查詢結(jié)合使用。如果需要對(duì)搜索結(jié)果進(jìn)行精確的篩選,并且不需要評(píng)分和排序,建議使用過濾器來提高查詢性能。
# 查詢xm=張三,并且age < 30 且 age >= 10 ,并且age 倒序
GET index/_search
{
"_source": ["xm","age"],
"query": {
"bool": {
"must": [
{
"match": {
"xm": "張三"
}
}
],
"filter": [
{
"range": {
"age": {
"gte": 10,
"lt": 30
}
}
}
]
}
},"sort": [
{
"age": {
"order": "desc"
}
}
]
}
# 查詢xm=張三,并且age < 30 且 age >= 10 ,并且 xm 字段值
GET index/_search
{
"_source": ["xm","age"],
"query": {
"bool": {
"must": [
{
"match": {
"xm": "張三"
}
}
],
"filter": [
{
"range": {
"age": {
"gte": 10,
"lt": 30
}
}
},
{
"exists": {
"field": "xm"
}
}
]
}
}
}
?文章來源:http://www.zghlxwxcb.cn/news/detail-684974.html
高亮查詢
# 對(duì)搜索結(jié)果命中的字段添加自定義html標(biāo)簽
GET index/_search
{
"query": {
"term": {
"xm": {
"value": "張三"
}
}
},
"highlight": {
"pre_tags": "<font color = 'red'>",
"post_tags": "</font>",
"fields": {
"xm": {}
}
},
"_source": "xm"
}
文章來源地址http://www.zghlxwxcb.cn/news/detail-684974.html
到了這里,關(guān)于elasticsearch簡(jiǎn)單入門語法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!