ElasticSearch常用的操作 - ES搜索引擎

操作基于es7, type的相关操作逐步去除。

一:简介
1,简述

Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。

2,应用举例
在这里插入图片描述
3,es和mysql的对照

mysqles
数据库(database)索引(index)
表(table)类型(type)
行(row)文档(document)
表结构(schema)映射(mapping)
索引全文检索

二:实操
1, 索引和映射操作
● 创建索引
● 查询索引
● 删除索引
● 查询映射
● 添加映射
● 创建索引并添加映射
● 修改映射

# 创建索引
PUT student

# 查询索引
GET student

# 删除索引
DELETE student

# 查询映射(在索引student存在的情况下)
GET student/_mapping

# 添加映射(在索引student存在的情况下)
PUT student/_mapping
{
  "properties":{
    "name":{
      "type":"keyword"
    },
    "age":{
      "type":"integer"
    }
  }
}

# 创建索引并添加映射(在索引student不存在的情况下)
PUT student
{
  "mappings": {
    "properties": {
      "name":{
        "type": "keyword"
      },
      "age":{
        "type":"integer"
      }
    }
    
  }
}

# 索引库中添加字段(在索引student存在的情况下,添加index中没有的字段)
PUT student/_mapping
{
  "properties":{
    "address":{
      "type":"text"
    }
  }
}

2,文档(数据)操作
• 添加文档
• 查询文档
• 修改文档
• 删除文档

# 确保有student索引的情况下,对student索引的文档操作
# 添加文档,指定id
PUT student/_doc/1
{
  "name":"张三",
  "age":12,
  "address":"北京"
}

# 查询文档
GET student/_doc/1

# 添加文档,不指定id(给一个随机id)
# 必须使用POST
POST student/_doc/
{
  "name":"李四",
  "age":20,
  "address":"深圳"
}

# 查询文档
GET student/_doc/u8b2QHUBCR3n8iTZ8-Vk

# 查询所有文档
GET student/_search

# 删除文档
DELETE student/_doc/1

# 修改文档 根据id,id存在就是修改,id不存在就是添加
PUT student/_doc/2
{
  "name":"zs",
  "age":20,
  "address":"上海"
}

3,查询
3.1 全文查询-match查询(模糊匹配,先分词再查询)
全文查询会分析查询条件,先将查询条件进行分词,然后查询,结果是其并集。

  GET student/_search
  {
    "query":{
      "match": {
        "address": "北京"
      }
    }
  }

在这里插入图片描述3.2 查询文档-term查询(精确匹配,查询条件不经过分词处理)
词条查询不会分析查询条件,只有当词条和查询字符串完全匹配时才匹配搜索

GET student/_search
{
  "query":{
   "term": {
     "address": {
       "value": "北京"
     }
   }
  }
}

在这里插入图片描述3.3 查询索引中的全部数据

GET student/_search

3.4 关键字搜索数据

GET student/_search?q=name:zs

3.5 DSL查询(先清空索引插入测试数据)

# 删除索引
DELETE student

# 重建索引和映射
PUT student
{
  "mappings": {
    "properties": {
      "name": {
        "type": "text"
      },
      "age": {
        "type": "integer"
      },
      "address":{
        "type":"text"
      },
      "sex":{
        "type":"keyword"
      }
    }
  }
}

# 插入新数据
PUT  student/_doc/1001
{
	"id":"1001",
	"name":"张三",
	"age":20,
	"sex":"男"
}
PUT  student/_doc/1002
{
	"id":"1002",
	"name":"李四",
	"age":25,
	"sex":"女"
}
PUT  student/_doc/1003
{
	"id":"1003",
	"name":"王五",
	"age":30,
	"sex":"女"
}
PUT  student/_doc/1004
{
	"id":"1004",
	"name":"赵六",
	"age":30,
	"sex":"男"
}

# 查询所有数据
GET student/_search

在这里插入图片描述3.5.1 根据年龄查询

GET student/_doc/_search
{
  "query":{
    "match":{
      "age":20
    }
  }
}

在这里插入图片描述3.5.2

引用:
https://blog.youkuaiyun.com/qq_24365213/article/details/79224630?ops_request_misc=&request_id=&biz_id=102&utm_term=bool%20filter%20must%20match&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-79224630.pc_search_result_no_baidu_js
# bool组合查询
# filter:过滤,不参与打分
# must:如果有多个条件,这些条件都必须满足  and与
# should:如果有多个条件,满足一个或多个即可 or或
# must_not:和must相反,必须都不满足条件才可以匹配到 !非

查询年龄大于20岁的女性用户

GET student/_search
{
  "query":{
    "bool":{
       "filter": {
         "range": {
           "age": {
             "gt": 20
           }
         }
       },
       "must": [
         {
           "match":{
             "sex":"女"
           }
         }
       ]
    }
  }
}

在这里插入图片描述
3.5.3 nested 复合检索
为什么需要使用nested检索:在复合结构中,如果内部结构又有关系,那么在检索时,如果不做类型处理,es会当作并集进行检索,结果就可能和我们预期的不一样。如下例演示:

#创建索引
    PUT movie
  {
    "mappings": {
      "properties": {
        "actors": {
          "properties": {
            "firstname": {
              "type": "keyword"
            },
            "lastname": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
  
#插入数据
PUT movie/_doc/1
{
"actors":[
  {
    "firstname":"zhang",
    "lastname":"san"
  },
  {
     "firstname":"wang",
    "lastname":"wu"
  }
  ]
}

#普通查询(两条数据分别为zhang san 和 wang wu   但是查询 zhang wu 的结果也查询出来了数据)
GET movie/_search
{
"query": {
  "bool": {
    "must": [
      {
        "match": {
          "actors.firstname": "zhang"
        }
      },
      {
        "match": {
          "actors.lastname": "wu"
        }
      }
    ]
  }
}
}

在这里插入图片描述
3.5.4 nested 复合检索解决此问题
① 删除索引重新建立索引
在这里插入图片描述
②nested 复合检索

GET movie/_search
{
  "query": {
    "nested": {
      "path": "actors",
      "query": {
        "bool": {
          "must": [
            {
              "match": {
                "actors.firstname": "zhang"
              }
            },
            {
              "match": {
                "actors.lastname": "wu"
              }
            }
          ]
        }
      }
    }
  }
}

③ 结果
在这里插入图片描述
在这里插入图片描述

<think>好的,我现在需要帮助用户解决关于Dify循环实现的问题。首先,我需要明确用户的具体需求。他们提到“dify 循环实现”或“dify 如何处理循环”,但Dify本身可能没有直接称为“循环”的功能,所以需要结合现有文档中的信息来推断可能的解决方案。 根据用户提供的引用内容,Dify工作流中有迭代节点[^1]。这可能类似于编程中的循环结构,用于重复执行某个任务。例如,在处理列表数据或需要多次执行同一操作时,迭代节点可以派上用场。我需要详细解释迭代节点的配置和使用步骤,确保用户能够理解如何设置循环次数或遍历数据集。 另外,用户可能对如何处理循环中的错误或性能问题感兴趣。引用[2]提到在Dify中处理PEM文件的问题,这可能涉及在循环中正确处理数据格式,避免错误积累。需要提醒用户在循环中注意错误处理和资源管理,确保每次迭代的稳定性。 引用[3]中的例子展示了如何结合FastAPI和Selenium进行实时监控并生成GIF,这可能涉及循环截取浏览器内容。虽然Dify本身可能不直接控制这类循环,但可以通过外部脚本或定时任务触发工作流,模拟循环执行。这部分需要说明如何将外部循环机制与Dify结合使用。 接下来,我需要组织回答结构。首先介绍迭代节点的基本概念和配置步骤,然后讨论循环中的数据处理和错误处理,最后补充外部触发循环的方法。同时,生成相关问题以帮助用户进一步探索,比如优化循环性能或处理复杂数据结构。 需要确保回答符合格式要求,使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。同时,引用标识要自然地添加到相关段落末尾,如、[^2]、[^3]。 最后,检查是否有遗漏点,比如Dify的其他循环相关功能或用户可能遇到的常见问题,确保回答全面且易于理解。</think>在Dify中处理循环逻辑主要通过**迭代节点**实现,以下是具体实现方式和应用场景的解析: ### 一、Dify循环实现机制 Dify通过**工作流设计器**中的迭代节点处理循环需求,其核心原理类似编程中的`for循环`。迭代节点可遍历以下数据类型: - 数组列表:`["A","B","C"]` - 字典集合:`{"key1":"value1", "key2":"value2"}` - 数值范围:通过`range()`函数生成序列 配置示例: ```python # 模拟迭代节点的数据输入 input_data = { "dataset": [1,2,3,4,5], "process_logic": "item * 2" # 对每个元素执行乘以2的操作 } ``` ### 二、迭代节点的关键配置步骤 1. **数据源绑定**:将数组/字典类型变量连接到迭代节点的输入端口 2. **循环变量命名**:设定当前元素的变量名(默认为`item`) 3. **子流程设计**:在迭代节点内部构建需要重复执行的逻辑模块 4. **结果聚合**:通过`outputs`收集所有迭代结果,支持数组或对象格式 $$ \text{总耗时} = \sum_{i=1}^{n}(单次迭代时间_i) + 系统开销 $$ ### 三、循环中的特殊处理 1. **错误中断控制**: - 启用`continueOnError`参数可跳过失败迭代 - 通过`try-catch`模块包裹敏感操作 2. **并行优化**: ```python # 伪代码示例 Parallel.forEach(dataset, lambda item: process(item)) ``` 3. **结果过滤**: ```python filtered = filter(lambda x: x%2==0, processed_results) ``` ### 四、应用场景案例 1. **批量文件处理**:遍历存储桶中的文件列表进行格式转换 2. **数据清洗**:对数据库查询结果集进行逐条校验 3. **API轮询**:定时循环调用第三方接口直到满足特定条件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值