ElasticSearch系列---【es常用devtools语法】
下面的内容建议直接粘进kibana的DevTools(开发工具devtools)里,作为一个查询模板
# 1.新增索引test2
PUT /test2
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"name": {
"type": "text",
#fielddata:默认为false,启用 fielddata,即为true时,这样会消耗大量内存,因为Es需要在内存中加载字段的所有值。只有在非常必要的情况下才应使用此选项。为false时,该字段不可用于聚合、排序和脚本操作的。text类型主要是用来做全文检索的。
"fielddata": false
},
"age": {
"type": "long"
},
"birthday": {
"type": "date",
"format": "yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis",
#当值为false时,当传入的值的日期格式和上面指定的不一致时,不能存入es索引,直接报错。
"ignore_malformed": false
}
}
}
}
# 2.新增索引test2的一条数据
POST /test2/_doc
{
"name": "里斯",
"age": 17,
"desc": "一顿操作猛如虎",
"tags": ["抽烟","喝酒"]
}
# 3.新增或修改索引test2的一条数据(存在就修改,不存在就新增,注意:不传的字段会覆盖成null,因此不建议用这个)
PUT /test2/_doc/3
{
"_name": "里斯4",
"age": 17,
"desc": "一顿操作猛如虎",
"tags": ["抽烟","喝酒"]
}
# 推荐的修改方法,这种不会覆盖没有传的字段的值为null
POST /test/_update/4
{
"doc": {
"desc": "修改后"
}
}
# 这个是上面推荐的修改方法的过时的写法,不推荐使用,放这里,方便后续看到了认识这种写法也是对的。
POST /test/_doc/2/_update
{
"doc": {
"desc": "修改后"
}
}
# 4.删除索引test2里_id为3的数据
DELETE /test2/_doc/3
#删除索引全部数据(清空索引)
POST /my_index/_delete_by_query
{
"query": {
"match_all": {}
}
}
# 5.查看test2索引映射
GET test2/_mapping
# 6.查询所有数据
GET test2/_search?pretty
{
"query": {
"match_all": {}
},
"_source": ["field1", "field2"]
}
# 7.单字段模糊查询
GET test2/_search
{
"query": {
"match": { "name": "里斯"}
},
"_source": ["field1", "field2"]
}
# 8.bool的复合查询
#match:会自动分词,适用于text类型的字段,由于需要进行分词和文本处理,可能会比 term 查询慢一些。
#在 Elasticsearch 中,must、must_not 和 should 语句是 bool 查询的一部分,用于构建复杂的、逻辑组合的查询。它们的意义与我们在编程或者逻辑中常用的 and、not 和 or 相似。以下是每个语句的详细解释:
#must:所有 must 中的查询都必须匹配,以便该文档被包含在结果中。这类似于逻辑 and 操作。
#must_not:所有 must_not 中的查询都不能匹配,以便该文档被包含在结果中。这类似于逻辑 not 操作。
#should:至少有一个 should 查询必须匹配,以便该文档被包含在结果中。但是,如果 must 或 filter 查询也存在的话,那么 should 查询就不是必须的。这类似于逻辑 or 操作。
#和 SQL 中的逻辑操作符相比,这些语句有一些不同之处。例如,SQL 中的 AND、OR 和 NOT 操作符通常在同一个条件语句中一起使用,而在 Elasticsearch 的 bool 查询中,must、must_not 和 should是作为不同查询的数组来使用的,每个数组中可以包含多个查询。
#以下是一个使用 must、must_not 和 should 的 bool 查询示例:
GET test2/_search
{
"query": {
"bool": {
"must": [
{ "match": { "field1": "value1" } },
{ "match": { "field2": "value2" } }
],
"must_not": [
{ "match": { "field3": "value3" } }
],
"should": [
{ "match": { "field4": "value4" } },
{ "match": { "field5": "value5" } }
]
}
}
}
# 9.term精确查询(适用于数字、日期、关键字类型的字段)
#性能快
#在Elasticsearch中,term查询用于执行精确匹配搜索。它用于查找那些具有确切值的字段,不会对搜索的词条进行分词(tokenizing),也不会进行任何文本处理(例如,小写化)。
#term查询通常用于数字、日期或者不分词的精确值字段(例如,关键字字段类型,即keyword类型)上。当你想精确匹配一个字段的完整未分词的值时,你会使用term查询。
#这里有一个使用term查询的例子:
GET test2/_search
{
"query": {
"term": {
"status": {
"value": "active"
}
}
}
}
#在上述查询中,Elasticsearch查找status字段精确是active的所有文档。如果有文档的status字段值为Active或ACTIVE,默认情况下,这些文档将不会被匹配,因为term查询区分大小写并且不会进行任何文本处理。
#与之相对的是match查询,match查询会分析查询字符串,根据字段的分析器(analyzer)处理,例如,通常会自动小写化,并根据分词器的设置将字符串拆分成一个或多个词条。match查询更适合于全文本字段的搜索,如使用text字段类型的情况。
#因此,选择term还是match查询取决于你的具体需求:是否需要进行精确匹配以及字段是否被分析。对于那些需要根据确切值过滤的情况,term查询是更好的选择。
# 10.filter
#当然,让我们通过一个更具体的例子来理解 Elasticsearch 中的 filter 使用。假设我们有一个电子商务网站,我们想要找到所有价格在 10 到 100 美元之间,并且品牌为 "Nike" 或 "Adidas" 的产品。我们可以使用 bool 查询结合 filter 来实现这个需求。
#以下是一个使用 filter 的查询示例:
GET test2/_search
{
"query": {
"bool": {
"must": [
{ "match": { "product_name": "running shoes" } }
],
"filter": [
{
"range": {
"price": {
"gte": 10,
"lte": 100
}
}
},
{
"terms": {
"brand": [ "Nike", "Adidas" ]
}
}
]
}
}
}
#在这个查询中:
#must 子句用于匹配产品名称中包含 "running shoes" 的文档。这部分是查询上下文,会影响文档的相关性得分。
#filter 子句包含两个部分:
#第一个 filter 使用 range 查询来过滤价格在 10 到 100 美元之间的产品。
#第二个 filter 使用 terms 查询来过滤品牌为 "Nike" 或 "Adidas" 的产品。
#这两个 filter 子句都不会影响文档的得分,它们只是简单地过滤出满足条件的文档。由于 filter 上下文的结果可以被缓存,这种查询在多次执行时会非常高效。
#总结来说,filter 在 Elasticsearch 中用于精确匹配和过滤文档,而不考虑相关性得分,这使得它们在需要快速过滤大量数据时非常有用。
# 11.传统分页(使用 from 和 size 参数)-适用于小数据量
#在 Elasticsearch 中,主要有两种分页方式:通过 from 和 size 参数进行的传统分页,以及通过 search_after 参数进行的深度分页。
#这是最常见的分页方式,你可以通过设置 from 和 size 参数来获取查询结果的特定页面。
#例如,要获取第2页的结果(假设每页有10个结果),可以这样设置:
GET test2/_search
{
"from": 10,
"size": 10,
"query": {
"match_all": {}
}
}
#在这里,“from”参数表示结果开始的位置,“size”参数表示返回的文档数量。这种分页方式简单直接,但在处理大量数据时可能会遇到性能问题,因为“from + size”的值不能大于 index.max_result_window 设置的值(默认值是10000)。
# 12.深度分页(使用 search_after 参数)---适用于大数据量
#对于需要检索大量数据的情况,Elasticsearch 推荐使用 search_after 参数进行深度分页。search_after 参数使用上一次查询结果中的排序值来获取下一页的数据。
GET test2/_search
{
"size": 10,
"query": {
"match_all": {}
},
"sort": [
{"date": "asc"},
{"_id": "desc"}
],
"search_after": ["2022-01-01T00:00:00", "100"]
}
#在这个示例中,search_after 参数中的值对应于 sort 中的字段。这种方法能有效地处理大量数据,因为它不依赖于偏移,而是直接使用上一次查询的排序值。
#总结起来,from 和 size 适合处理较小的数据集,而 search_after 更适合处理大量数据的深度分页。
愿你走出半生,归来仍是少年!
浙公网安备 33010602011771号