当前位置: 首页 > news >正文

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.dtcms.com/a/106735.html

相关文章:

  • 机器学习的一百个概念(8)插补法
  • LeetCode hot 100—最长递增子序列
  • PyQt5界面设计
  • 现代几何风格网页标牌标识logo海报标题设计psai英文字体安装包 Myfonts – Gilroy Font Family
  • React安装使用教程
  • vue3源码分析 -- runtime
  • ES6中增强对象
  • 虚幻引擎控制角色跟随移动方向旋转的方法
  • NLP高频面试题(三十二)——介绍一下CLIP和CLIP2
  • 【WebGL】getContext参数详解
  • 黑马 C++ 学习笔记
  • 红包-算法
  • HTB - Cat记录
  • Android学习总结之算法篇四(字符串)
  • 如何数据清洗
  • Python办公自动化(3)对Excel的操作
  • 安装docker和配置加速
  • (1)英特尔 RealSense T265(二)
  • 笔记:Vue3+Vite 怎么导入静态资源,比如图片/组件
  • 【算法学习】分治篇:分治算法的类型和解题详解
  • try语句总结
  • Docker Registry Clean
  • Scala的面向对象
  • 云巅之上:数字文明的重构与超越
  • C++进阶知识复习 16~30
  • bootloader+APP中,有些APP引脚无法正常使用?
  • 模拟医生会诊,四川大学华西医院团队开发多智能体对话框架助力疾病诊断
  • 【LINUX操作系统】通过System V看内核管理IPC资源
  • 经典算法 最大子段和
  • UE5学习笔记 FPS游戏制作37 蓝图函数库 自己定义公共方法