目录
注意事项
创建数据库
删除数据库
查找数据库
创建同义词数据库,数据库一定要先存在
修改同义词数据库
4.表(type)创建表
查看表结构
修改表结构,添加字段,不能删除字段和修改字段
删除表结构
清除表数据
查询所有数据
插入数据
修改数据
通过id查找数据
通过多个id查找数据
批量操作 批量操作不能json不能换行,只能1行。批量操作可以同时进行新增,删除,修改
批量添加
批量不同操作
5.版本号控制查询显示版本号
更新数据,版本号锁定
外部版本号,外部版本号要大于内部版本号,当内部版本号为2时候,外部版本号要大于2
6.search查询查询所有数据
查询三星手机
查询手机价格为:29900000
查找手机并按价格降序排
查找手机并按价格降序排第1条
7.term和terms查询term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date。 相当于不分词
查找价格为1100
查询多个价格
8.分页查询from:从哪一个文档开始 size:需要的个数
9.match查询match query知道分词器的存在,会对filed进行分词操作,然后再查询。查询条件分词 term是不知道分词器的存在,相当于查询条件不分词。
结果
查询所有文档
multi_match:可以指定多个字段
match_phrase:短语匹配查询相当于一个单词匹配 ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变:
前缀匹配查询
10.指定返回查询字段
11.排序
12.使用通配符*,匹配字段
13.范围查询range:实现范围查询
参数:from,to,include_lower,include_upper,boost,gte,lte,gt,lt
include_lower:是否包含范围的左边界,默认是true
include_upper:是否包含范围的右边界,默认是true
14. wildcard查询(*和?查询)允许使用通配符* 和 ?来进行查询
*代表0个或多个字符
?代表任意一个字符
15. fuzzy实现模糊查询value:查询的关键字,date类型不行
boost:查询的权值,默认值是1.0
min_similarity:设置匹配的最小相似度,默认值为0.5,对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天
prefix_length:指明区分词项的共同前缀长度,默认是0
max_expansions:查询中的词项可以扩展的数目,默认可以无限大
16. 高亮搜索结果高亮搜索结果
17. Filter查询filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。
18. 组合过滤查询可以实现组合过滤查询
格式:
{ "bool": { "must": [], "should": [], "must_not": [] } }
must:必须满足的条件---and
should:可以满足也可以不满足的条件--or
must_not:不需要满足的条件--not
查询价格10元或者1100元
查询三星手机价格10元或者1100元
19. 过滤非空
20. 过滤器缓存ElasticSearch提供了一种特殊的缓存,即过滤器缓存(filter cache),用来存储过滤器的结果,被缓存的过滤器并不需要消耗过多的内存(因为它们只存储了哪些文档能与过滤器相匹配的相关信息),而且可供后续所有与之相关的查询重复使用,从而极大地提高了查询性能。
注意:ElasticSearch并不是默认缓存所有过滤器, 以下过滤器默认不缓存:
numeric_range script geo_bbox geo_distance geo_distance_range geo_polygon geo_shape and or not
exists,missing,range,term,terms默认是开启缓存的
开启方式:在filter查询语句后边加上 "_catch":true
21. 聚合查询
22. 复合查询### 2.10 复合查询
将多个基本查询组合成单一查询的查询
#### 2.10.1 使用bool查询
接收以下参数:
must: 文档 必须匹配这些条件才能被包含进来。
must_not: 文档 必须不匹配这些条件才能被包含进来。
should: 如果满足这些语句中的任意语句,将增加 _score,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter: 必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
相关性得分是如何组合的。每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。
下面的查询用于查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果 _两者_ 都满足,那么它排名将更高:
{ "bool": { "must": { "match": { "title": "how to make millions" }}, "must_not": { "match": { "tag": "spam" }}, "should": [ { "match": { "tag": "starred" }}, { "range": { "date": { "gte": "2014-01-01" }}} ] } }
如果没有 must 语句,那么至少需要能够匹配其中的一条 should 语句。但,如果存在至少一条 must 语句,则对 should 语句的匹配没有要求。 如果我们不想因为文档的时间而影响得分,可以用 filter 语句来重写前面的例子:
{ "bool": { "must": { "match": { "title": "how to make millions" }}, "must_not": { "match": { "tag": "spam" }}, "should": [ { "match": { "tag": "starred" }} ], "filter": { "range": { "date": { "gte": "2014-01-01" }} } } }
通过将 range 查询移到 filter 语句中,我们将它转成不评分的查询,将不再影响文档的相关性排名。由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能。
bool 查询本身也可以被用做不评分的查询。简单地将它放置到 filter 语句中并在内部构建布尔逻辑:
{ "bool": { "must": { "match": { "title": "how to make millions" }}, "must_not": { "match": { "tag": "spam" }}, "should": [ { "match": { "tag": "starred" }} ], "filter": { "bool": { "must": [ { "range": { "date": { "gte": "2014-01-01" }}}, { "range": { "price": { "lte": 29.99 }}} ], "must_not": [ { "term": { "category": "ebooks" }} ] } } } }
#### 2.10.2 constant_score查询
它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。
{ "constant_score": { "filter": { "term": { "category": "ebooks" } } } }
term 查询被放置在 constant_score 中,转成不评分的filter。这种方式可以用来取代只有 filter 语句的 bool 查询。 |
删除数据库
DELETE taotao_v1 |
查找数据库
GET taotao_v1 |
- 同义词(_alias)
创建同义词数据库,数据库一定要先存在
PUT _alias { "actions": [ { "add": { "alias": "taotao", "index": "taotao_v1" }} ] } |
修改同义词数据库
POST /_aliases { "actions": [ { "remove": { "alias": "taotao", "index": "taotao_v2" }}, { "add": {
"alias": "taotao", "index": "taotao_v1" }} ] } |
4.表(type)
创建表
POST taotao/tb_item/_mapping { "properties": { "title":{"type": "text","analyzer":"ik_max_word"}, "sell_point":{"type": "text","analyzer":"ik_max_word"}, "price":{"type": "double"}, "cat_name":{"type": "text","analyzer":"ik_max_word"}, "create_time":{"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" } } } |
查看表结构
GET taotao/tb_item/_mapping |
修改表结构,添加字段,不能删除字段和修改字段
POST taotao/tb_item/_mapping { "properties": { "name": { "type": "keyword" } } } |
删除表结构
没办法删除表结构 |
清除表数据
POST taotao/tb_item/_delete_by_query?conflicts=proceed { "query": { "match_all": {} } } |
查询所有数据
POST taotao/tb_item/_search { "query": { "match_all": {} } } |
插入数据
POST taotao/tb_item/536563 { "title":"new2 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待", "sell_point":"清仓!仅北京,武汉仓有货!", "price":29900000, "cat_name":"手机", "create_time":"2015-03-08 21:33:18" } |
修改数据
POST taotao/tb_item/536563 { "title":"new3 - 阿尔卡特 (OT-927) 炭黑 联通3G手机 双卡双待", "sell_point":"清仓!仅北京,武汉仓有货!", "price":29900000, "cat_name":"手机", "create_time":"2015-03-08 21:33:18" } |
通过id查找数据
GET taotao/tb_item/536563 |
通过多个id查找数据
GET taotao/tb_item/_mget { "ids":[536563,562379] } |
批量操作
批量操作不能json不能换行,只能1行。批量操作可以同时进行新增,删除,修改
批量添加
POST taotao/tb_item/_bulk {"index":{"_id":605616}} { "title":"阿尔卡特 (OT-979) 冰川白 联通3G手机","sell_point":"清仓!仅上海仓有货!","price":30900,"cat_name":"手机","create_time":"2015-03-08 21:33:18"} {"index":{"_id":635906}} {"title":"阿尔卡特 (OT-927) 单电版 炭黑 联通3G手机 双卡双待","sell_point":"清仓!仅北京,武汉仓有货!","price":24900,"cat_name":"手机","create_time":"2015-03-08 21:33:18"} |
批量不同操作
POST /lib2/books/_bulk
{"delete":{"_index":"lib2","_type":"books","_id":4}}
{"create":{"_index":"tt","_type":"ttt","_id":"100"}}
{"name":"lisi"}
{"index":{"_index":"tt","_type":"ttt"}}
{"name":"zhaosi"}
{"update":{"_index":"lib2","_type":"books","_id":"4"}}
{"doc":{"price":58}} |
5.版本号控制
查询显示版本号
GET taotao/tb_item/_search { "version":true, "query": { "match_all": {} } } |
更新数据,版本号锁定
POST taotao/tb_item/562379?version=1 { "title":"new3- 三星 W999 黑色 电信3G手机 双卡双待双通" } |
外部版本号,外部版本号要大于内部版本号,当内部版本号为2时候,外部版本号要大于2
POST taotao/tb_item/562379?version=3&version_type=external { "title":"new3- 三星 W999 黑色 电信3G手机 双卡双待双通" } |
6.search查询
查询所有数据
GET taotao/tb_item/_search { "query": { "match_all": {} } } |
查询三星手机
GET taotao/tb_item/_search?q=%E4%B8%89%E6%98%9F |
查询手机价格为:29900000
GET taotao/tb_item/_search?q=price: 29900000 |
查找手机并按价格降序排
GET taotao/tb_item/_search?q=%E6%89%8B%E6%9C%BA&sort=price:desc |
查找手机并按价格降序排第1条
GET taotao/tb_item/_search?q=%E6%89%8B%E6%9C%BA&sort=price:desc&from=0&size=1 |
7.term和terms查询
term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date。 相当于不分词
查找价格为1100
GET taotao/tb_item/_search { "query": { "term": { "price":1100 } } } |
查询多个价格
GET taotao/tb_item/_search { "query": { "terms": { "price":[1100,30900] } } } |
8.分页查询
from:从哪一个文档开始
size:需要的个数
GET taotao/tb_item/_search { "from": 0, "size": 2, "query": { "match_all": {} } } |
9.match查询
match query知道分词器的存在,会对filed进行分词操作,然后再查询。查询条件分词
term是不知道分词器的存在,相当于查询条件不分词。
GET taotao/tb_item/_search { "query": { "match": { "title": "三星 黑色" } } } |
结果
GET taotao/tb_item/_search { "query": { "term": { "title": "三星 黑色" } } } |
查询所有文档
GET taotao/tb_item/_search { "version":true, "query": { "match_all": {} } } |
multi_match:可以指定多个字段
GET taotao/tb_item/_search { "query": { "multi_match": { "query": "黑色", "fields": ["title","cat_name"] } } |
match_phrase:短语匹配查询相当于一个单词匹配
ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变:
GET taotao/tb_item/_search { "query": { "match_phrase": { "title": "三星 W999" } } } |
前缀匹配查询
GET taotao/tb_item/_search { "query": { "match_phrase_prefix": { "title": "联通3" } } } |
10.指定返回查询字段
GET taotao/tb_item/_search { "_source":["title","price"], "query": { "match_all": {} } } |
11.排序
GET taotao/tb_item/_search { "query": { "match_all": {} }, "sort": [ { "price": { "order": "desc" } }, { "create_time": { "order": "desc" } } ] } |
12.使用通配符*,匹配字段
GET taotao/tb_item/_search { "_source": { "includes": ["tit*","pr*"], "excludes": "sel*" }, "query": { "match_all": {} } } |
13.范围查询
range:实现范围查询
参数:from,to,include_lower,include_upper,boost,gte,lte,gt,lt
include_lower:是否包含范围的左边界,默认是true
include_upper:是否包含范围的右边界,默认是true
GET taotao/tb_item/_search { "query": { "range": { "price": { "gte": 10, "lte": 200000 } } } } |
GET taotao/tb_item/_search { "query": { "range": { "price": { "from": 10, "to": 200000, "include_lower": true, "include_upper": false } } } } |
14. wildcard查询(*和?查询)
允许使用通配符* 和 ?来进行查询
*代表0个或多个字符
?代表任意一个字符
GET taotao/tb_item/_search { "query": { "wildcard": { "title": "联通*" } } } |
GET taotao/tb_item/_search { "query": { "wildcard": { "title": "阿尔卡?" } } } |
15. fuzzy实现模糊查询
value:查询的关键字,date类型不行
boost:查询的权值,默认值是1.0
min_similarity:设置匹配的最小相似度,默认值为0.5,对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天
prefix_length:指明区分词项的共同前缀长度,默认是0
max_expansions:查询中的词项可以扩展的数目,默认可以无限大
GET taotao/tb_item/_search { "query": { "fuzzy": { "title": "联通3" } } } |
16. 高亮搜索结果
高亮搜索结果
GET taotao/tb_item/_search { "query": { "match": { "title": "阿尔卡" } }, "highlight": { "pre_tags": [ "<em class='c_color'>" ], "post_tags": [ "</em>" ], "fields": { "title": {} } } } |
17. Filter查询
filter是不计算相关性的,同时可以cache。因此,filter速度要快于query。
GET taotao/tb_item/_search { "post_filter": { "match": { "title": "阿尔卡" } } } |
18. 组合过滤查询
可以实现组合过滤查询
格式:
{
"bool": {
"must": [],
"should": [],
"must_not": []
}
}
must:必须满足的条件---and
should:可以满足也可以不满足的条件--or
must_not:不需要满足的条件--not
查询价格10元或者1100元
GET taotao/tb_item/_search { "post_filter": { "bool":{ "should":[ {"term":{"price":10}}, {"term":{"price":1100}} ] } } } |
查询三星手机价格10元或者1100元
GET taotao/tb_item/_search { "post_filter": { "bool":{ "should":[ {"term":{"price":10}}, {"term":{"price":1100}} ], "must":[ {"term":{"title":"三星"}} ] } } } |
GET /lib4/items/_search { "post_filter": { "bool": { "should": [ {"term": {"itemID": "id100123"}}, { "bool": { "must": [ {"term": {"itemID": "id100124"}}, {"term": {"price": 40}} ] } } ] } } } |
19. 过滤非空
GET /lib4/items/_search { "query": { "bool": { "filter": { "exists":{ "field":"price" } } } } }
GET /lib4/items/_search { "query" : { "constant_score" : { "filter": { "exists" : { "field" : "price" } } } } } |
20. 过滤器缓存
ElasticSearch提供了一种特殊的缓存,即过滤器缓存(filter cache),用来存储过滤器的结果,被缓存的过滤器并不需要消耗过多的内存(因为它们只存储了哪些文档能与过滤器相匹配的相关信息),而且可供后续所有与之相关的查询重复使用,从而极大地提高了查询性能。
注意:ElasticSearch并不是默认缓存所有过滤器,
以下过滤器默认不缓存:
numeric_range
script
geo_bbox
geo_distance
geo_distance_range
geo_polygon
geo_shape
and
or
not
exists,missing,range,term,terms默认是开启缓存的
开启方式:在filter查询语句后边加上
"_catch":true
21. 聚合查询
(1)sum
GET /lib4/items/_search { "size":0, "aggs": { "price_of_sum": { "sum": { "field": "price" } } } }
(2)min
GET /lib4/items/_search { "size": 0, "aggs": { "price_of_min": { "min": { "field": "price" } } } }
(3)max
GET /lib4/items/_search { "size": 0, "aggs": { "price_of_max": { "max": { "field": "price" } } } }
(4)avg
GET /lib4/items/_search { "size":0, "aggs": { "price_of_avg": { "avg": { "field": "price" } } } }
(5)cardinality:求基数
GET /lib4/items/_search { "size":0, "aggs": { "price_of_cardi": { "cardinality": { "field": "price" } } } }
(6)terms:分组
GET /lib4/items/_search { "size":0, "aggs": { "price_group_by": { "terms": { "field": "price" } } } } |
对那些有唱歌兴趣的用户按年龄分组 GET /lib3/user/_search { "query": { "match": { "interests": "changge" } }, "size": 0, "aggs":{ "age_group_by":{ "terms": { "field": "age", "order": { "avg_of_age": "desc" } }, "aggs": { "avg_of_age": { "avg": { "field": "age" } } } } } } |
22. 复合查询
### 2.10 复合查询
将多个基本查询组合成单一查询的查询
#### 2.10.1 使用bool查询
接收以下参数:
must:
文档 必须匹配这些条件才能被包含进来。
must_not:
文档 必须不匹配这些条件才能被包含进来。
should:
如果满足这些语句中的任意语句,将增加 _score,否则,无任何影响。它们主要用于修正每个文档的相关性得分。
filter:
必须 匹配,但它以不评分、过滤模式来进行。这些语句对评分没有贡献,只是根据过滤标准来排除或包含文档。
相关性得分是如何组合的。每一个子查询都独自地计算文档的相关性得分。一旦他们的得分被计算出来, bool 查询就将这些得分进行合并并且返回一个代表整个布尔操作的得分。
下面的查询用于查找 title 字段匹配 how to make millions 并且不被标识为 spam 的文档。那些被标识为 starred 或在2014之后的文档,将比另外那些文档拥有更高的排名。如果 _两者_ 都满足,那么它排名将更高:
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }},
{ "range": { "date": { "gte": "2014-01-01" }}}
]
}
}
如果没有 must 语句,那么至少需要能够匹配其中的一条 should 语句。但,如果存在至少一条 must 语句,则对 should 语句的匹配没有要求。
如果我们不想因为文档的时间而影响得分,可以用 filter 语句来重写前面的例子:
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
],
"filter": {
"range": { "date": { "gte": "2014-01-01" }}
}
}
}
通过将 range 查询移到 filter 语句中,我们将它转成不评分的查询,将不再影响文档的相关性排名。由于它现在是一个不评分的查询,可以使用各种对 filter 查询有效的优化手段来提升性能。
bool 查询本身也可以被用做不评分的查询。简单地将它放置到 filter 语句中并在内部构建布尔逻辑:
{
"bool": {
"must": { "match": { "title": "how to make millions" }},
"must_not": { "match": { "tag": "spam" }},
"should": [
{ "match": { "tag": "starred" }}
],
"filter": {
"bool": {
"must": [
{ "range": { "date": { "gte": "2014-01-01" }}},
{ "range": { "price": { "lte": 29.99 }}}
],
"must_not": [
{ "term": { "category": "ebooks" }}
]
}
}
}
}
#### 2.10.2 constant_score查询
它将一个不变的常量评分应用于所有匹配的文档。它被经常用于你只需要执行一个 filter 而没有其它查询(例如,评分查询)的情况下。
{
"constant_score": {
"filter": {
"term": { "category": "ebooks" }
}
}
}
term 查询被放置在 constant_score 中,转成不评分的filter。这种方式可以用来取代只有 filter 语句的 bool 查询。