ElasticSearch系列文章三 ElasticSearch的基本操作

编程入门 行业动态 更新时间:2024-10-22 15:37:05

ElasticSearch系列文章三  ElasticSearch的基本<a href=https://www.elefans.com/category/jswz/34/1770947.html style=操作"/>

ElasticSearch系列文章三 ElasticSearch的基本操作

ElasticSearch 基本操作
集群健康
GET /_cluster/health

cluster-health 会返回一个 JSON 响应

{"cluster_name" : "demeter-elasticsearch","status" : "green","timed_out" : false,"number_of_nodes" : 1,"number_of_data_nodes" : 1,"active_primary_shards" : 3,"active_shards" : 3,"relocating_shards" : 0,"initializing_shards" : 0,"unassigned_shards" : 0,"delayed_unassigned_shards" : 0,"number_of_pending_tasks" : 0,"number_of_in_flight_fetch" : 0,"task_max_waiting_in_queue_millis" : 0,"active_shards_percent_as_number" : 100.0
}

这里主要看一下status字段,状态有三个值 green、yellow、red

green

​ 所有的主分片和副本父分片都已分配,集群100%可用。

yellow

​ 所有的主分片已经分片,但至少还有一个副本分片是缺失的。不会有数据丢失,所以搜索结果依然是完整的。不过高可用性在某种程度上被弱化。如果更多的分片消失,就会丢数据。

red

​ 至少一个主分片(以及它的全部副本)都在丢失中。搜索只能返回部分数据,而分配到这个分片的写入请求会返回一个异常。

  • number_of_nodesnumber_of_data_nodes 这个命名完全是自描述的。
  • active_primary_shards 指出你集群中的主分片数量。这是涵盖了所有索引的汇总值。
  • active_shards 是涵盖了所有索引的所有分片的汇总值,即包括副本分片。
  • relocating_shards 显示当前正在从一个节点迁往其他节点的分片的数量。通常来说应该是 0,不过在 Elasticsearch 发现集群不太均衡时,该值会上涨。比如说:添加了一个新节点,或者下线了一个节点。
  • initializing_shards 是刚刚创建的分片的个数。比如,当你刚创建第一个索引,分片都会短暂的处于 initializing 状态。这通常会是一个临时事件,分片不应该长期停留在 initializing 状态。你还可能在节点刚重启的时候看到 initializing 分片:当分片从磁盘上加载后,它们会从 initializing 状态开始。
  • unassigned_shards 是已经在集群状态中存在的分片,但是实际在集群里又找不着。通常未分配分片的来源是未分配的副本。比如,一个有 5 分片和 1 副本的索引,在单节点集群上,就会有 5 个未分配副本分片。如果你的集群是 red 状态,也会长期保有未分配分片(因为缺少主分片)。
索引的基本操作

创建索引

number_of_shards:分片数

number_of_replicas:副本数

PUT /index_test
{"settings": {"index": {"number_of_shards": "2","number_of_replicas": "0"}}
}


查看索引

GET _cat/indices?v

删除索引

DELETE /index_test

创建索引的同时创建mappings映射

PUT /index_mapping
{"mappings": {"properties": {"realname": {"type": "text","index": true},"username": {"type": "keyword","index": false}}}
}



index默认true,设置为false的话,name这个字段就不会被索引。

某个属性一旦被建立,就不能修改了,但是可以新增额外属性



主要数据类型

  • text, keyword, string

  • long, integer, short, byte

  • double, float

  • boolean

  • date

  • object

  • 数组不能混,类型一致

keyword:不会被分词,不会被倒排索引,直接匹配搜索。

text:可以被倒排索引。

文档的基本操作

添加

POST /my_doc/_doc/1 -> {索引名}/_doc/{索引ID}(是指索引在es中的id,而不是这条记录的id,比如记录的id从数据库来是1001,并不是这个。如果不写,则自动生成一个字符串。建议和数据id保持一致> )
POST /my_doc/_doc/1001
{"id": 1001,"name": "test","desc": "nice to meet you","create_date": "2020-02-22"
}

在es中并没有my_doc这个索引,索引也没有手动建立mappings,但是在插入文档时会创建索引,并且会根据文档类型自动设置属性类型,这个就是es的动态映射,在index索引库中去建立数据结构的相关配置信息。


发现name、desc字段会有fields属性,

  • “fields”: {“type”: “keyword”}:对一个字段设置多种索引模式,使用text类型做全文索引,也可使用keyword做聚合和排序。
  • “ignore_above” : 256:设置字段索引和存储的长度最大值,超过则被忽略

修改

  • 局部

    POST /my_doc/_doc/1001/_update
    {"doc": {"name": "demeter"}
    }
    

  • 全局

    PUT /my_doc/_doc/1001
    {"id": 1001,"name": "demeter-put","desc": "no problem","create_date": "2020-02-23"
    }
    

每次更新之后 version会修改

删除

DELETE /my_doc/_doc/1001
  • 文档删除不是立即删除,文档还是保存在磁盘上,索引增长越来越多,才会把那些曾经标识过删除的,进行清理,从磁盘上移出去。

查询

查看单一文档

GET /my_doc/_doc/1001

查询全部文档

GET /my_doc/_doc/_search

元数据

  • index:文档数据所属那个索引,理解为数据库的某张表即可。
  • type:文档数据属于哪个类型,新版本使用**_doc**。
  • _id:文档数据的唯一标识,类似数据库中某张表的主键。可以自动生成或者手动指定。
  • score:查询相关度,是否契合用户匹配,分数越高用户的搜索体验越高。
  • version:版本号。
  • source:文档数据,json格式。

定制结果集

GET /my_doc/_doc/1001?_source=id,name
GET /my_doc/_doc/_search?_source=id,name

判断文档是否存在

HEAD /my_doc/_doc/1001
乐观锁

Elasticsearch是分布式的。创建,更新或删除文档时,必须将文档的新版本复制到群集中的其他节点。Elasticsearch也是异步和并发的,这意味着这些复制请求是并行发送的,并且可能不按顺序到达其目的地。Elasticsearch需要一种方法来确保文档的旧版本永远不会覆盖新版本。

在创建一个文档时,并为其分配 _seq_no_primary_term

两个客户端同时更新一个文档,第一个人根据文档当前的 _seq_no 和 _primary_term 去更新文档,更新成功,同时文档的 _seq_no 和 _primary_term 会增加;如果此时第二个人用增加前的 _seq_no 和 _primary_term 尝试更新文档,会失败;当更新失败的时候,就需要程序去处理更新失败的问题;通过这种机制,保证并发写的正确性;

内置分词器

分词

把文本转换为一个个的单词,分词称之为analysis。es默认只对英文语句做分词,中文不支持,每个中文字都会被拆分为独立的个体。

英文示例:

POST /_analyze
{"analyzer": "standard","text": "php is the best language in the world"
}


中文示例:

POST /_analyze
{"analyzer": "standard","text": "德墨忒尔"
}

es的内置分词器

  • standard:默认分词,单词会被拆分,大小会转换为小写。

  • simple:按照非字母分词。大写转为小写。

  • whitespace:按照空格分词。忽略大小写。

  • stop:去除无意义单词,比如the/a/an/is

  • keyword:不做分词。把整个文本作为一个单独的关键词。

中文分词器

github地址:

将elasticsearch-analysis-ik-7.6.0.zip安装包上传到 /home/software 解压/usr/local/elasticsearch-7.6.0/plugins/ik即可

unzip elasticsearch-analysis-ik-7.6.0.zip -d /usr/local/elasticsearch-7.6.0/plugins/ik

若没有unzip命令 先安装unzip

yum install -y unzip zip

ik中文分词有两种分词器

  • ik_max_word: 会将文本做最细粒度的拆分

  • ik_smart: 会做最粗粒度的拆分

    ik_max_word会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”

    ik_smart会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”

自定义中文词库

  • 在{es}/plugins/ik/config下,创建:
vim custom.dic
  • 添加自定义词语

    德墨忒尔
    很方
    
  • 配置自定义扩展词典

    vim /usr/local/elasticsearch-7.6.0/plugins/ik/config/IKAnalyzer.cfg.xml
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE properties SYSTEM ".dtd">
    <properties><comment>IK Analyzer 扩展配置</comment><!--用户可以在这里配置自己的扩展字典 --><entry key="ext_dict">custom.dic</entry><!--用户可以在这里配置自己的扩展停止词字典--><entry key="ext_stopwords"></entry><!--用户可以在这里配置远程扩展字典 --><!-- <entry key="remote_ext_dict">words_location</entry> --><!--用户可以在这里配置远程扩展停止词字典--><!-- <entry key="remote_ext_stopwords">words_location</entry> -->
    </properties>
    
  • 重启es

更多推荐

ElasticSearch系列文章三 ElasticSearch的基本操作

本文发布于:2024-02-25 16:31:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1699610.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:操作   系列   文章   ElasticSearch

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!