ELK 8.0.0 数据增删改查

发布时间 2023-06-27 22:38:48作者: f_carey

ELK 8.0.0 数据增删改查

1 创建文档数据

PUT fcarey/_doc/1
{
  "name":"fcarey",
  "age":18,
  "city":"sz",
  "tag":["python","elk"]
}

PUT fcarey/_doc/2
{
  "name":"user01",
  "age":18,
  "city":"xm",
  "tag":["python","go"]
}

PUT fcarey/_doc/3
{
  "name":"user02",
  "age":27,
  "city":"sh",
  "tag":["go","php"]
}

PUT fcarey/_doc/4
{
  "name":"user03",
  "age":18,
  "city":"sh",
  "tag":["go","php","python and php"]
}

2 查找所创建的文档

# 查询fcarey索引中的所有文档
GET fcarey/_search

GET fcarey/_doc/1

# 查看当前系统中的索引

GET _cat/indices?v&s=index:asc
# 其中参数 v 全称是 verbose,表示返回详细的输出;s 参数表示进行排序(sort),形式 s=column1,column2:<desc/asc>。
/*
health: 当前健康状态
status: 开启/关闭(open/close)状态
index: 索引名称
uuid: 索引 uuid
pri: 主分片数目
rep: 副本分片数目
docs.count: 可用的文档数目
docs.deleted: 已删除的文档数目
store.size: 主分片和副本分片的存储文档空间大小
pri.store.size: 主分片的存储文档空间大小
GET _cat/indices?help
*/

3 更新文档中的数据

# 将1文档中的age字段修改为20
POST fcarey/_update/1
{
  "doc": {
    "age": 20
  }
}

4 删除索引

PUT test/_doc/1
{
  "name":"fcarey",
  "age":18,
  "city":"sz",
  "tag":["python","elk"]
}

# 删除test索引
DELETE test

GET test/_search

5 match

5.1 match_all

# match_all是没有任何条件,检索全部数据
GET fcarey/_search
{
  "query": {
    "match_all": {}
  }
}

5.2 match

match用来做基本的模糊匹配,在es中会对文本进行分词,在match查询的时候也会对查询条件进行分词,然后通过倒排索引找到匹配的数据。在match中支持以下参数:

  • query:查询条件
    • operator:匹配条件(AND、OR (Default))
    • minimum_should_match:最小匹配的数量,用来指定文档中至少包含几个关键字才算匹配到
    • fuzziness:最大编辑距离,详细参考Term级别查询中fuzzy查询一节的内容。
    • prefix_length:通过最大编辑距离进行模糊查询额时候,开始的多少个字符不允许被模糊,默认值为0。下面有例子
    • fuzzy_transpositions:boolean值,默认true,表示扩展模糊选项的时候,是否包含两个相邻字符的位置互换这种手段
    • fuzzy_rewrite:可以重写查询方法,目前还没实践到,关于更多说明可以参考:rewrite parameter
    • analyzer:可以指定分词器,如果不指定,用默认的
    • max_expansions:参考Term级别查询中fuzzy查询一节的内容。
    • zero_terms_query:在实际的文档中,可能有很多这样的词,比如中文中的的,了,呢,或者英文中的or、and、is、do等。那么这样的词对我们的搜索可能是没有任何帮助的,我们把这些的词- 叫做停用词,ES中有一个停用词分析器:Stop token filter,如果我们的查询请求的关键字中包括这些词,并且用到了这个分析器,那么他会帮我们把这些停用词移除掉。如果我们的查询请求中所有的关键字都被移除掉了,就不会匹配到任何文档,那么这个时候,是否要给用户返回一个空呢?ES提供了两种策略,也就是通过这个字段去表示的:
      • none (default):不返回任何文档
      • all:返回所有文档,相当于执行了match_all
    • lenient:lenient有仁慈的,宽容的意思。这里表示是否忽略一些输入错误,比如为一个数字类型的字段输入了一个字符串去匹配,如果设置为true,会忽略,默认值是false
    • auto_generate_synonyms_phrase_query:在有些场景,可能一个意思有两种写法,比如ElasticSearch有些人可能会写成ES,虽然写法不一样,但是描述的是一个东西,那么如果我们限定查询条件为ElasticSearch,其实也是希望能搜索到ES相关内容的。我们可以把这种词叫做同义词查询。因此ES为我们提供了这个参数,表示是否开启同义词查询,默认是true,也就是开启的。但是有一个问题就是ES他怎么知道哪些词是同义词呢?Lucene中有一个概念叫Synonym Graph Token Filter,那么ES中也是有的,我们可以通过对这个进行配置来实现同义词查询
GET fcarey/_search
{
  "query": {
    "match": {
      "tag": "python elk"
    }
  }
}

5.3 match_phrase

# match_phrase(phrase: 短语) 会对输入做分词,但是需要结果中也包含所有的分词,并且顺序要求一致。这个条件其实有一点苛刻了,有时候可能我输入错了,或者一个短语,只记得其中两个单词,第三个单词死活记不起来怎么办呢?ES也提供了slop这个参数帮我们解决这个问题:slop (default 0):(slop:溢出)来指定额外加几个单词也可以命中。

GET fcarey/_search
{
  "query": {
    "match_phrase": {
      "tag": {
        "query": "python php",
        "slop": 1
      }
    }
  }
}