基础语法
类型
字符串
- text:被分析索引的字符串类型
- keyword:不能被分析只能被精确匹配的字符串类型
日期
- Date:日期类型,可以配合 format 一起使用
数字
- long
- integer
- short
- double
布尔
- true
- false
数组
- []
对象
- {}
ip
- 如 127.0.0.1
地理 Geo_point
创建
1. 非结构化创建
PUT /index/_doc/1
{
"name": "kingmusi",
"age": 30
}
- elasticsearch会自动分析相应的类型
"properties": {
"age": {
"type": "long"
},
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
2. 若已存在则不创建,不存在才创建
因为已存在,所以以下执行会报错
POST /index/_create/1
{
"name": "test"
}
3. 结构化创建
如果插入的数据不符合结构,报错
PUT /index
{
"mappings": {
"properties": {
"name": { "type": "text" },
"age": { "type": "integer" }
}
}
}
如果要自定义
analysis
,则需要在 setting 中定义,如以下自定义中英文分词器PUT /index { "settings": { "number_of_shards": 1, "number_of_replicas": 1, "analysis": { "analyzer": { "english_ik": { "filter": ["stemmer"], "type": "custom", "tokenizer": "ik_smart" }, "english_ik_max": { "filter": ["stemmer"], "type": "custom", "tokenizer": "ik_max_word" } } } }, "mappings": {} }
更新
1. 全量更新
PUT /index/_doc/1
{
"name": "kingmusi1"
}
- 则
/employee/_doc/1
会被更新为
{
"name": "kingmusi1"
}
age
会没了
2. 指定更新
POST /index/_update/1
{
"doc": {
"name": "kingmusi1"
}
}
获取
设有以下数据
[ { "_id": 1, "name": "杰", "age": 20 }, { "_id": 2, "name": "兄弟", "age": 30 }, { "_id": 3, "name": "兄长", "age": 31 } ]
1. 获取单条数据
GET /index/_doc/1
2. 获取全部
GET /index/_search
3. 分页查询
- 只查出第一条数据
GET /index/_search
{
"from": 0,
"size": 1
}
4. 带关键词查询单字段
term:精确匹配
match:经过分词
查出
兄弟
和兄长
两条数据,只要包含分词后的其中一个词就能被查出
GET /index/_search
{
"query": {
"match": { "name": "兄妹" }
}
}
- 最少包含分词中的两(可以自定义多少个)个词
GET /index/_search
{
"query": {
"match": {
"title": {
"query": "兄 妹",
"operator": "or",
"minimum_should_match": 2
}
}
}
}
- 包含全部分词
GET /index/_search
{
"query": {
"match": {
"title": {
"query": "兄 妹",
"operator": "and"
}
}
}
}
5. 带关键词查询多字段
best_field:默认模式
,取所有字段得分中的最高得分
GET /index/_search
{
"query": {
"multi_match": {
"query": "basketball alien",
"fields": ["title", "overview"]
}
}
}
most_field:所有字段的得分相加
GET /index/_search
{
"query": {
"multi_match": {
"query": "basketball alien",
"fields": ["title", "overview"],
"type": "most_fields"
}
}
}
cross_field:所有关键词在所有字段中的最高得分相加
GET /index/_search
{
"query": {
"multi_match": {
"query": "basketball alien",
"fields": ["title", "overview"],
"type": "cross_fields"
}
}
}
可以给某字段得分加权
GET /index/_search { "query": { "multi_match": { "query": "basketball alien", "fields": ["title^10", "overview"], "type": "most_fields" } } }
6. 带排序查询
- 查出
兄弟
和兄长
两条数据,并且按照age排序
GET /index/_search
{
"query": {
"match": { "name": "兄" }
},
"sort": [
{ "age": { "order": "desc" } }
]
}
6. 筛选查询(类似于where)
name
字段有兄age
字段大于等于25
- 只有
filter
时,会使打分为0
GET /index/_search
{
"query": {
"bool": {
"filter": [
{ "term": { "name": "兄" } },
{ "range": {
"popularity": { "gte": 25 }
}}
]
}
}
}
name
字段有兄,并且以此分词为评分标准age
字段大于等于25
- 带打分的
filter
GET /index/_search
{
"query": {
"bool": {
"should": [
{"match": {"name": "兄"}}
],
"filter": [
{ "range": {
"popularity": { "gte": 25 }
}}
]
}
}
}
7. 带聚合
- 查出数据中有 aggregations,可以看到聚合的信息
GET /index/_search
{
"query": {
"match_all": {}
},
"aggs": {
"group_by_age": {
"terms": {
"field": "age"
}
}
}
}
删除
DELETE /index/_doc/1