elasticsearch中的DSL语句操作

文章目录

概要

基本上这些,有需要的再补充:

创建索引时的关键字段

  • number_of_shards: 索引中主分片的数量,决定了数据分布的广度和横向扩展的能力。一旦设置好之后不能改变。
  • number_of_replicas: 每个主分片拥有的副本分片的数量,用于提供数据冗余和提高查询的并发能力。
  • mappings: 定义索引中字段名和字段数据类型的容器,可以看作是Elasticsearch中的"表结构"。

文档操作中的关键字段

  • _doc: 表示文档类型,在7.x之前的版本中Elasticsearch支持多种类型,但在7.x之后已被弃用,统一使用_doc。
  • _update: 用于更新现存文档的关键字。
  • doc: 在更新操作中,表示需要被更新的字段和它们新的值。

查询操作中的关键字段

  • query: 包含了所有查询条件的容器。
  • match: 一个全文搜索的查询,匹配指定字段中包含的文本。
  • term: 用于精确值匹配,不分析字段内容,用于不分词的字段或精确值查询。
  • bool: 用于组合多个查询子句,并可以通过must(必须匹配)、should(至少匹配一个)、must_not(必须不匹配)、filter(过滤且不计算得分)等来定义查询逻辑。
  • filter: 类似于查询,但它不计算得分而只是过滤数据,这通常有助于提高性能。
  • range: 用于匹配指定字段值处于特定范围的文档。
  • gte, lte: 分别代表范围查询中的"大于等于"和"小于等于"。

分页和排序中的关键字段

  • from: 用于分页,表示从哪个文档开始返回。
  • size: 也用于分页,表示返回多少个查询结果。
  • sort: 用于指定根据哪个字段以什么样的顺序来排序结果。

高亮查询的关键字段

  • highlight: 用于配置结果高亮显示的容器。
  • fields: 指定哪些字段需要高亮显示。

聚合操作的关键字段

  • aggs (或aggregations): 用于配置聚合操作的容器。
  • terms: 一个典型的桶(buckets)聚合,用来创建基于某个字段的不同值的桶。
  • avg, sum, min, max: 各种度量聚合类型,用来计算平均值、求和、最小值、最大值等。

每个字段和字段名在Elasticsearch查询DSL中都有特定的目的和行为。查询的编写需要对这些关键字段及其用法有深刻的了解。在构造查询时,这些字段以JSON对象的形式组合在一起,形成对Elasticsearch数据的精确和高效查询。

操作语句

索引操作:

1、创建索引 (Create an Index)

java 复制代码
PUT /my_index               // 使用PUT动作创建一个名为"my_index"的索引
{
  "settings": {             // "settings"类别用于设定索引相关的具体配置
    "number_of_shards": 1,      // "number_of_shards"指定了索引分片的数量
    "number_of_replicas": 1     // "number_of_replicas"指定了每个分片的副本数量
  },
  "mappings": {             // "mappings"类别用于定义索引中字段的名称和类型
    "properties": {             // "properties"定义了索引包含的字段及其数据类型
      "title": { "type": "text" },      // "title": 字段名,类型为"text",适用于全文搜索
      "date": { "type": "date" },       // "date": 字段名,类型为"date",存储日期
      "views": { "type": "integer" }    // "views": 字段名,类型为"integer",存储整数
    }
  }
}

2、查看索引 (Get Index Information)

java 复制代码
GET /my_index               // 使用GET动作获取名为"my_index"的索引信息

3、更新索引设置 (Update Index Settings)

java 复制代码
PUT /my_index/_settings     // 使用PUT动作更新名为"my_index"的索引设置
{
  "settings": {
    "number_of_replicas": 2  // "number_of_replicas"更新索引副本的数量为2
  }
}

4、删除索引 (Delete an Index)

java 复制代码
DELETE /my_index            // 使用DELETE动作删除名为"my_index"的索引

5、删除索引中的所有数据(Delete By Query)

java 复制代码
POST /my_index/_delete_by_query  // 使用POST动作删除满足查询条件的索引内数据
{
  "query": {                      // "query"定义删除操作的查询条件
    "match_all": {}               // "match_all"查询匹配索引中的所有文档,即删除所有数据
  }
}

6、关闭索引 (Close an Index)

java 复制代码
POST /my_index/_close           // 使用POST动作关闭名为"my_index"的索引

7、打开索引 (Open an Index)

java 复制代码
POST /my_index/_open            // 使用POST动作打开名为"my_index"的索引

这些基本操作是管理Elasticsearch索引的关键。创建索引时,可以定义索引的结构和行为,例如分片数量、副本数量,以及字段的类型。更新设置,删除索引中的数据,以及整个索引的删除,都是索引生命周期的常见操作。通过这些操作,你可以维护、优化或删除存储在Elasticsearch集群中的数据。

数据查询

1、Match Query

进行全文搜索,会对查询的文本进行分词。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"部分定义了查询的条件
    "match": {                    // "match"查询用于全文搜索,支持文本分析
      "field_name": "text to search" // "field_name"是你希望搜索的字段,后面是搜索的文本
    }
  }
}

2、Match Phrase 查询

搜索与指定短语匹配的文档,保留短语中词语的相对位置。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "match_phrase": {             // "match_phrase"用于精确短语匹配,考虑词组内的词语顺序
      "field_name": "exact phrase" // "field_name"指定字段,"exact phrase"为要匹配的短语
    }
  }
}

3、Range 查询

对数值或日期字段进行范围查询。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "range": {                    // "range"查询检索指定范围内的值
      "field_name": {             // "field_name"是你想要检索范围的字段
        "gte": 10,                // "gte"代表大于等于10
        "lte": 20                 // "lte"代表小于等于20
      }
    }
  }
}

4、Bool 查询

组合多个查询条件,支持must(必须)、should(至少一个)和must_not(必须不)关键字。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "bool": {                     // "bool"查询组合多个查询条件
      "must": [                   // "must"关键字表示条件必须匹配
        { "match": { "field1": "value1" } }
      ],
      "should": [                 // "should"关键字表示至少一个条件应该匹配
        { "term": { "field2": "value2" } }
      ],
      "must_not": [               // "must_not"关键字表示条件必须不匹配
        { "range": { "field3": { "gt": "value3" } } }
      ]
    }
  }
}

5、Term 查询

对字段进行精确匹配。

java 复制代码
GET /my_index/_search
{
  "query": {  // "query"定义查询条件
    "term": { // "term"查询执行精确匹配
      "field_name": "exact_value" // "field_name"是要匹配的字段; "exact_value"是精确查询的精确值,通常用于keyword标签或其他不分析的文本字段
    }
  }
}

6、Terms 查询

针对一个字段匹配多个精确值。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "terms": {                    // "terms"查询可用于一个字段匹配多个值
      "field_name": ["value1", "value2"] // "field_name"是要匹配的字段; 数组包含所有要匹配的精确值
    }
  }
}

7、Exists 查询

查询指定字段中有值的文档。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "exists": {                   // "exists"查询找出指定字段有值的文档
      "field": "field_name"       // "field"字段名说明哪个字段必须有值
    }
  }
}

8、Wildcard 查询

进行通配符搜索,允许使用星号(*)和问号(?)作为通配符,星号代表零个或多个字符,问号代表一个字符。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "wildcard": {                 // "wildcard"查询支持使用通配符进行搜索
      "field_name": "te*t?"       // "field_name"是要搜索的字段; "te*t?"示例中,搜索以"te"开头以一个任意字符结束,中间有任意多个字符的文本
    }
  }
}

9、Prefix 查询

查找具有指定前缀的字段值。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "prefix": {                   // "prefix"查询用于查找具有指定前缀的字段值
      "field_name": "prefix_value" // "field_name"是字段名; "prefix_value"是需要匹配的前缀
    }
  }
}

10、Fuzzy 查询

允许查询与指定的模糊匹配值相近的词。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "fuzzy": {                    // "fuzzy"查询允许错误拼写(Levenshtein 编辑距离)
      "field_name": {             // "field_name"是字段名
        "value": "text",          // "value"指定要搜索的近似值
        "fuzziness": "AUTO"       // "fuzziness"定义模糊程度,"AUTO"将自动根据长度选择距离
      }
    }
  }
}

11、Query String 查询

支持直接输入复杂查询字符串,包含各类操作符。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "query_string": {             // "query_string"支持直接传入查询表达式
      "default_field": "field_name",   // "default_field"指定默认查询字段
      "query": "(new york city) OR (big apple)"  // "query"中定义复杂查询字符串
    }
  }
}

12、Multi-Match 查询

在多个字段上执行相同的查询条件。

java 复制代码
GET /my_index/_search
{
  "query": {                      // "query"定义查询条件
    "multi_match": {              // "multi_match"在多个字段上进行文本搜索
      "query": "search text",     // "query"是要匹配的文本
      "fields": ["field1", "field2^3"] // "fields"定义了多个字段,给"field2"一个更高的权重(3)
    }
  }
}

Elasticsearch 提供了多种查询类型和相关参数,使得用户能够根据具体的需求灵活地构建查询。每个查询类型针对不同的使用场景和需求,从简单的文本匹配到基于地理位置和其他高级功能,为数据检索提供了广泛的可能性。

继续介绍一些更高级或特殊用途的查询类型:

13、Geo-空间查询(Geospatial Queries)

java 复制代码
GET /my_index/_search
{
  "query": {
    "geo_distance": {            // "geo_distance"查询基于地理位置的距离查询
      "distance": "200km",       // "distance"指定查询范围的距离
      "location": {              // "location"是存储地理坐标的字段
        "lat": 40.73,
        "lon": -74.1
      }
    }
  }
}

14、聚合 (Aggregations)

对数据进行统计分析。

java 复制代码
GET /my_index/_search
{
  "size": 0,                   // "size": 0表示不返回查询结果,仅返回聚合结果
  "aggs": {                    // "aggs"定义了聚合操作
    "popular_tags": {          // "popular_tags"自定义该聚合操作的名称
      "terms": {               // "terms"聚合为桶聚合,统计字段中出现的唯一值
        "field": "tags"        // "field"指定了要执行聚合统计的字段
      }
    }
  }
}

15、Highlighting(高亮)

返回查询结果时突出显示匹配的字符串。

java 复制代码
GET /my_index/_search
{
  "query": {  
    "match": { 
      "content": "search term"
    }
  },
  "highlight": {              // "highlight"指定了需要高亮的字段
    "fields": {
      "content": {}           // "content"是文档内的一个字段,将会被高亮显示匹配的部分
    }
  }
}

16、Suggesters(建议器)

提供基于输入文本的建议。

java 复制代码
GET /my_index/_search
{
  "suggest": {                // "suggest"定义了建议查询
    "text": "tring out elasticsearch", // "text"定义了要被纠正或提出建议的文本
    "simple_phrase": {        // "simple_phrase"是自定义的建议器名称
      "phrase": {             // "phrase"定义了词组建议器类型,用于纠正文本片段
        "field": "content"    // "field"指定了用于生成建议的字段
      }
    }
  }
}

17、Scripting(脚本)

使用脚本进行动态计算。

java 复制代码
GET /my_index/_search
{
  "query": {  
    "script_score": {        // "script_score"查询允许基于脚本表达式调整得分
      "query": { "match_all": {} }, // "query"定义了基础查询
      "script": {            // "script"定义了用于调整查询得分的脚本
        "source": "math.log(_score * 2) + params.my_modifier", // "source"脚本本身
        "params": {          // "params"定义了传递给脚本的参数
          "my_modifier": 0.1
        }
      }
    }
  }
}

这只是Elasticsearch提供的查询功能中的一小部分。Elasticsearch查询DSL非常灵活和强大,支持各种条件和结构复杂的查询,满足几乎所有搜索需求。学习和掌握Elasticsearch查询DSL是进行高效数据检索不可或缺的。

小结

没什么结的,就是个API用就行了

相关推荐
小二·几秒前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic23 分钟前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王25 分钟前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康30 分钟前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
转世成为计算机大神1 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
宅小海1 小时前
scala String
大数据·开发语言·scala
小白的白是白痴的白1 小时前
11.17 Scala练习:梦想清单管理
大数据
qq_327342731 小时前
Java实现离线身份证号码OCR识别
java·开发语言
java1234_小锋2 小时前
Elasticsearch是如何实现Master选举的?
大数据·elasticsearch·搜索引擎
阿龟在奔跑3 小时前
引用类型的局部变量线程安全问题分析——以多线程对方法局部变量List类型对象实例的add、remove操作为例
java·jvm·安全·list