python操作es

1、常用操作


### 创建索引
```bash
curl -u 'elastic:123' -X PUT -H "Content-Type: application/json" -d @mapping.json "http://0.0.0.0:9200/ai_kg_extraction_new_lower_tag_index"
```
### 删除索引
```bash
curl -u 'elastic:123' -X DELETE "http://0.0.0.0:9200/ai_kg_extraction_new_lower_tag_index"
```
### 查询索引下的数据量总和
```bash
curl -u 'elastic:123' -X GET "http://0.0.0.0:9200/ai_kg_extraction_new_lower_tag_index/_count"
```
### 查询es下索引的状态
```bash
curl -u 'elastic:123' -X GET "http://0.0.0.0:9200/ai_kg_extraction_new_lower_tag_index/_stats?pretty"
```
```bash
curl -u 'elastic:123' -X GET "http://0.0.0.0:9200/ai_kg_extraction_new_lower_tag_index/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "match_all": {}
    }
}'   
```

mapping.json

{"mappings": {"properties": {"target_term": {"type": "keyword"},"definitions": {"type": "nested","properties": {"definition": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"source": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"confidence": {"type": "float"},"context_snippet": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"}}},"related_terms": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"ambiguity_notes": {"type": "text","analyzer": "ik_max_word","search_analyzer": "ik_smart"},"doc_ts": {"type": "date","format": "epoch_millis"},"type": {"type": "integer"},"type_name": {"type": "text"},"id": {"type": "text"}}}
}

2、测试搜索 text

前面的 keyword 类型的字段搜索需要把握的是完全一样就行,而对于 text 字段的搜索,text 字段的内容在写入 es 时本身会被分词处理,所以搜索 text 的处理并不完全一样。

在这里,我么用的 address 字段是 text 类型,我们还是用前面的示例作为演示。

term

term 的搜索是不分词的,搜索给定字符串的全部内容,比如对于我们插入的 id=4 的那条数据,address 的内容是 read a book,它被分词为三个,read、a、book,所以我们使用 term 方法搜索下面三个都可以搜到这条数据:

GET /exam/_search
{"query": {"term": {"address": "read"}}}GET /exam/_search
{"term": {"address": "a"}}GET /exam/_search
{"term": {"address": "book"}}

但是,如果我们 address 后面的值如下这种就搜索不到了,因为 term 操作并不会给搜索的内容进行分词,而是作为一个整体进行搜索:

GET /exam/_search
{"query": {"term": {"address": "read a"}}}GET /exam/_search
{"query": {"term": {"address": "a book"}}}GET /exam/_search
{"query": {"term": {"address": "read a book"}}}

但是还有一种情况,那就是对于搜索的 text 字段后加上 .keyword 字段的操作,这个相当于将 address 不分词进行搜索,将 address 这个字段看作是一个 keyword 来操作,可以理解成是使用 term 来搜索 keyword 字段,就是上一个类型的操作。

所以下面的这个操作就是可以搜索到 address='read a book' 的数据

GET /exam/_search
{"query": {"term": {"address.keyword": "read a book"}}}

match

match,模糊匹配,在匹配前会将搜索的字符串进行分词,然后将匹配上的数据按照匹配度(在 es 里有一个 _score 字段用于表示这种匹配程度)倒序返回。

比如我们对 address 字段搜索字符串 a,会返回两条数据,id 为 4 和 5 的,因为 address 字段进行分词存储后都包含这个字符串。

GET /exam/_search
{"query": {"match": {"address": "a"}}}

或者我们搜索内容为 read a,match 搜索会先将其分词,变成 reada,然后匹配分词后包含这两个字符串一个或者两个的数据,在这里也会返回两条,一条的结果是 read a book,一条是 you can get a good job,因为这两条数据都包含字符串 a,但是因为前者分别满足了两个搜索的条件,所以前者的匹配度会更高,所以作为第一条数据返回:

GET /exam/_search
{"query": {"match": {"address": "read a"}}}

match_phrase

匹配短语,使用这个方法不加其他参数的情况下,可以看作是会匹配包含这个短语、且顺序一致的数据。

比如说对于 address="read a book" 的数据,搜索 read aa bookread a book 都可以筛选到这条数据。

GET /exam/_search
{"query": {"match_phrase": {"address": "read a"}}}GET /exam/_search
{"query": {"match_phrase": {"address": "a book"}}}GET /exam/_search
{"query": {"match_phrase": {"address": "read a book"}}}

但是如果搜索 book a,因为顺序不一致,所以下面的搜索是无法搜素到该数据的:

GET /exam/_search
{"query": {"match_phrase": {"address": "book a"}}}

但是 match_phrase 有一个 slop 参数可以用于忽略这种顺序,也就是允许搜索的关键词错位的个数,比如 'book a',分词后的 'book' 和 'a' 如果允许错位两个顺序(a 往前挪一个,book 往后挪一个,这是我理解的 slop 的操作用法),那么就可以筛选到我们这条数据,示例如下:

GET /exam/_search
{"query": {"match_phrase": {"address": {"query": "book a","slop": 2}}}
}

match_phrase_prefix

匹配前缀,比如对于 address 值为 'read a book' 的数据,我们只知道的值是 'read a bo',想要根据这个搜索词搜索完整的数据,就可以用到 match_phrase_prefix。

他的用法是这样的,先将检索词分词,然后将最后一个分词结果单独去匹配,所以这个搜索词的过程就是先根据 'read a' 的分词结果搜索到一些数据,然后根据剩下的 'bo' 去匹配满足这个前缀的数据:

GET /exam/_search
{"query": {"match_phrase_prefix": {"address": "read a bo"}}}

3、match 的其他用法

匹配分词后的全部结果

对于 match,前面我们介绍过会先将搜索的字符串分词,然后去筛选包含分词结果一至多个的结果。

比如前面介绍的搜索 'read a',会搜索出 'read a book' 以及 'you can get a good job',因为他们都包含分词的结果 'a',这种操作就类似于用 should 去对分词结果进行进一步的搜索操作,

但是如果我们想要更精确,搜索的内容必须包含分词的全部结果 'read' 和 'a',我么可以加上 operator 参数:

GET /exam/_search
{"query": {"match": {"address": {"query": "read a","operator": "and"}}}
}

这样操作结果就是筛选了包含全部搜索词分词后结果的数据。

匹配的模糊处理

我们可以通过 fuzziness 字段来打开字符模糊匹配的开关,最简单的一个例子就是比如我们搜索 'read',打字不小心打成了 'raed',这种就可以实现他的模糊匹配:

GET /exam/_search
{"query": {"match": {"address": {"query": "raed a","operator": "and","fuzziness": 1}}}
}

4、multi-match 搜索

前面我们的 match 参数操作的都是针对于单个字段,multi_match 则可以针对于多个字段进行 match 操作,这个需要都能匹配上搜索的关键字,使用示例如下:

GET /exam/_search
{"query": {"multi_match": {"query": "python","fields": ["name", "address"]}}
}

其中,fields 是一个数组,里面是需要搜索的字段。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/75285.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

记一个.NET AOT交叉编译时的坑

记一个.NET AOT交叉编译时的坑 背景: 使用.NET9开发的Avalonia项目需要部署到Linux-arm64 踩坑: 根据官方AOT交叉编译文档配置后执行打包 dotnet publish -r linux-arm64提示error : The PrivateSdkAssemblies ItemGroup is required for _ComputeA…

【Linux篇】探索进程地址空间:计算机背后的虚拟世界

进程地址空间的奥秘:让你理解程序如何在计算机中生存 一. 程序地址空间1.1 基本概念1.2 虚拟内存管理1.3 为什么存在虚拟地址空间1.3.1 意义 2. 最后 本文将介绍进程地址空间的基本概念与结构,帮助读者理解操作系统如何管理和分配内存。进程地址空间指的…

17查询文档的方式

目录 1.鼠标放在你要查询的地方或者选中,按FnF1 2Assistant文档 3帮助菜单界面 1.鼠标放在你要查询的地方或者选中,按FnF1 2Assistant文档 3帮助菜单界面 大家一定要有 查询文档 的意识!! 未来实际开发中,一定会用到很多的第三方库和框架的. 很可能用到的…

壹起航:引领中国工厂迈向全球市场的先锋

在全球化的浪潮中,中国工厂正积极寻求拓展海外市场的新机遇。面对激烈的国际竞争,如何脱颖而出,成为行业翘楚?壹起航凭借其深厚的行业积淀和创新的营销理念,为中国工厂提供了全方位的出海解决方案。 一、构建国际化外…

“数据导航仪”:企业迁移知识库如何赋能精准决策

在全球化与区域经济一体化的浪潮下,企业迁移已成为经济发展的重要现象。 无论是为了拓展市场、降低成本,还是为了寻找更好的政策环境,企业迁移都牵动着无数从业者的心。 然而,面对海量且分散的企业迁移信息,金融机构…

理解激活函数,多个网络层之间如何连接

1. 激活函数如何在两个层之间作用 如果不在两个层之间添加激活函数,模型将无法学习非线性关系,表现出像线性模型一样的局限性。 LeakyReLU(0.2) 是一个激活函数,它的作用是对每一层的输出进行非线性转换。激活函数通常在神经网络中用于增加网…

红帽Linux怎么重置密码

完整流程 ●重启操作系统,进入启动界面 ●然后按进入选择项界面 ●找到linux单词开头的那一行,然后移动到该行末尾(方向键移动或者使用键盘上的end),在末尾加入rd.break ●按ctrl x进入rd.break模式 ●在该模式下依次…

pycharm与python版本

python 3.6-3.9 pycharm 2021版本搭配最好 python 3.8 pycharm 2019版本搭配最好 pycharm各版本下载

Java系统集成AI大模型:是否需要训练模型及实现路径

越来越多的Java系统希望通过集成AI大模型能力来提升智能化水平。然而,许多开发者在面对这一任务时,常常会有一个疑问:是否需要训练AI大模型才能实现这一目标?本文将深入探讨这一问题,并提供详细的解决方案。 一、是否…

论文阅读笔记:Denoising Diffusion Implicit Models (3)

0、快速访问 论文阅读笔记:Denoising Diffusion Implicit Models (1) 论文阅读笔记:Denoising Diffusion Implicit Models (2) 论文阅读笔记:Denoising Diffusion Implicit Models &#xff08…

【Linux】Linux 系统启动流程详解

1. BIOS/UEFI 阶段 硬件自检(POST) BIOS/UEFI 执行硬件检查(内存、CPU、外设等)。若硬件异常,通过蜂鸣码或屏幕提示错误。 选择启动设备 按配置顺序(硬盘、U盘、网络等)寻找可引导设备。BIOS&a…

C++封装、继承、多态(虚函数)

目录 1、封装 2、继承 继承方式: (1)公有继承;public (2)保护继承;protected (3)私有继承;private 菱形继承: 同名隐藏? 含义…

蓝桥杯冲刺:一维前缀和

系列文章目录 蓝桥杯系列:一维前缀和 文章目录 系列文章目录前言一、暴力的写法:二、一维前缀和的模板: 具体实现: 三、具体例题:求和 1.题目参考:2.以下是具体代码实现: 总结 前言 上次我介绍…

使用UDP建立连接,会存在什么问题?

使用UDP建立连接,会存在可靠性、有序性、连接状态管理等方面的问题: 1、数据传输不可靠: UDP没有确认和重传机制,发送方发送数据后,不会等待接收方的确认消息。这意味着如果数据在传输过程中丢失,发送方不…

YOLOv5配置训练以及华为昇腾910B推理

参考文章: 保姆式yolov5教程,训练你自己的数据集 - 知乎 Windows 10|11下安装mmyolo-0.5.0版本 - 知乎 Ubuntu22.04安装教程&基于华为Ascend AI处理器的om模型atc转换环境安装_ubuntu安装atc工具-CSDN博客嵌入式AI---在华为昇腾推理自己的yolov5目标…

基于yolov11的汽车损伤检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv11的汽车损伤检测系统是一种先进的计算机视觉技术,旨在快速准确地识别汽车的各种损伤类型。该系统利用YOLOv11模型的强大性能,实现了对车辆损伤的精确检测与分类。 该系统能够识别的损伤类型包括裂纹(crack&#xff…

[ 3分钟算法 ] | 递归搜索题目 : 合并两个有序链表(递归版)

目录 1. 题目链接: 2. 思路分析: 1. 重复子问题? 2. 具体子问题? 3. 递归出口? 3. 代码实现: 4. 小结: 1. 循环(迭代) vs 递归 2. 递归 vs 深搜 1. 题目链接: 21. 合并…

单元测试原则之——不要模拟值对象 (1)

1. 什么是值对象(Value Objects)? 值对象是指那些不可变且仅通过其属性(数据)来定义的对象。它们通常没有复杂的逻辑或行为,主要用于存储和传递数据。例如: ● 字符串(String) ● 数字(Integer, Double) ● 日期(LocalDate, Instant) ● 自定义的简单数据类(如…

【软件】在Windows和Ubuntu上使用TFTP和NFS

在Windows和Ubuntu上使用TFTP和NFS 零、介绍 最近在玩Linux开发板,在开发的过程中发现需要用到tftp和nfs来帮助传输文件,故此记录如何使用这两种软件。 TFTP(Trivial File Transfer Protocol) :是一种简化的文件传输…

JS判断变量是否为空的方法

在 JavaScript 中,判断变量是否为空需要根据不同的数据类型和具体需求来处理。以下是常见场景的解决方案: 1. 基础判断:null 或 undefined javascript if (value null || value undefined) {// 变量为空 } 或简写为: javasc…