全文检索是指计算机索引程序通过扫描文章中的每一个词,对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。这个过程类似于通过字典中的检索字表查字的过程。
全文检索的方法主要分为按字检索和按词检索两种。
简单理解,全文检索是指:
针对单词建立索引,并保存该单词在文本中的位置、以及出现的次数
。正排索引:通过主键定位到某条数据。
倒排索引:
通过搜索关键词定位到主键,然后再通过主键获取完整数据。与正排索引刚好相反。
ES底层在检索时使用的就是倒排索引。
ES中的索引并非传统索引的含义,ES中的索引是存放数据的地方,是 ES中的一个概念词汇。
一个索引(Index)就是一个拥有几分相似特征的文档的集合。
索引类似于我们 Mysql里面的一个数据库 ,好比是一个索引库。
类型是用来定义数据结构的。
从 7.0版本开始,一个索引只能创建一个 type = “_doc”,好比数据库里面的一张表,描述每个字段的类型。
Elasticsearch是面向文档的,文档是所有可搜索数据的最小单位。
文档会被序列化成JSON格式,保存在Elasticsearch中。
文档就是最终的数据了,可以认为一个文档好比关系型数据库中表里面的一条记录数据。
GET /db_idx2/_doc/2
#结果
{
"_index" : "db_idx2",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "赵云2",
"sex" : 1,
"desc" : "打野位"
}
}
元数据,用于标注文档的相关信息:
一个 document有一个或者多个 field组成。
字段好比关系型数据库中列的概念。
一台服务器,无法存储大量的数据,ES把一个 index里面的数据,分为多个 shard,分布式的存储在各个服务器上面。
一个分布式的集群,难免会有一台或者多台服务器宕机,如果我们没有副本这个概念。就会造成我们的 shard发生故障,无法提供正常服务。
为了保证数据的安全,ES引入了 replica的概念,可以保证我们数据的安全。
在 ES集群中,我们一模一样的数据有多份,能正常提供查询和插入的分片我们叫做 primary shard(主分片),其余的我们就管他们叫做 replica shard(备份的分片) 。
所以当你有一个节点的时候,这个分片是不会把副本存在这仅有的一个节点上的,当你新加入了一台节点,ES会自动的给你在新机器上创建一个之前分片的副本。
基本格式:PUT /索引名称
注意:
索引命名必须全部小写,不能以下划线开头。
#创建索引
PUT /db_idx1
#创建索引:设置分片数和副本数
PUT /db_idx2
{
"settings":{
"number_of_shards":3,
"number_of_replicas":2
}
}
基本格式:GET /索引名称/参数
#查看索引详情
GET /db_idx1
#结果
{
"db_idx1" : {
"aliases" : { },
"mappings" : { },
"settings" : {
"index" : {
"routing" : {
"allocation" : {
"include" : {
"_tier_preference" : "data_content"
}
}
},
"number_of_shards" : "1",
"provided_name" : "db_idx1",
"creation_date" : "1655285175682",
"number_of_replicas" : "1",
"uuid" : "tY-2ukPPRVOcKER2WsPiCw",
"version" : {
"created" : "7170499"
}
}
}
}
}
GET /_all
GET /*
#查看索引是否存在
HEAD /db_idx3
#结果
{"statusCode":404,"error":"Not Found","message":"404 - Not Found"}
基本格式:
PUT /_settings 更新所有索引的。
PUT {index}/_settings 更新一个或多个索引的settings。
索引的设置信息分为静态信息和动态信息两部分。静态信息不可更改,如索引的分片数。动态信息可以修改。
设置项请参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules.html#index-modules-settings
#修改索引配置
PUT /db_idx1/_settings
{
"index":{
"number_of_replicas":2
}
}
基本格式:DELETE /索引名称
#删除索引
DELETE /db_idx1
#结果
{
"acknowledged" : true
}
基本格式:POST /索引名称/[_doc | _create ]/id
#创建文档,指定id
POST /db_idx2/_doc/1
{
"name":"赵云",
"sex":1,
"desc":"打野位"
}
POST /db_idx2/_create/2
{
"name":"赵云2",
"sex":1,
"desc":"打野位"
}
#创建文档,ES生成id
POST /db_idx2/_doc/
{
"name":"刘备",
"sex":1,
"desc":"射手打野"
}
1)根据 id查询
基本格式: GET /索引名称/_doc/id
GET /db_idx2/_doc/2
#结果
{
"_index" : "db_idx2",
"_type" : "_doc",
"_id" : "2",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"name" : "赵云2",
"sex" : 1,
"desc" : "打野位"
}
}
2)条件查询 _search
基本格式: GET /索引名称/_doc/_search
#查询sex等于1的
GET /db_idx2/_doc/_search?q=sex:1
#查询 db_idx2下的所有文档数据
GET /db_idx2/_doc/_search?version=true
更过复杂查询后面单独了解。
基本格式:DELETE /索引名称/_doc/id
#KQPOZoEB_wUaJOnPq3hT为上面添加文档时,ES生成的id。或者使用我们指定的id
DELETE /db_idx2/_doc/KQPOZoEB_wUaJOnPq3hT
1)全量更新:整个json都会替换
基本格式:PUT /索引名称/_doc/id
#全量修改 id=1 文档
PUT /db_idx2/_doc/1
{
"name":"赵子龙",
"sex":1,
"age":18,
"desc":"常山"
}
2)部分更新:使用_update部分更新
基本格式:POST /索引名称/_update/id
#增量修改 id=1 文档
POST /db_idx2/_update/1
{
"doc": {
"name":"赵子龙",
"sex":1,
"age":20,
"desc":"常山DD",
"otherdd":"dddd"
}
}
3)根据条件更新文档
使用 _update_by_query 条件更新文档
。更多条件更新文档后面了解。
下面示例一个简单的:
# sex=1的文档,更新age=55
POST /db_idx2/_update_by_query
{
"query": {
"match": {
"sex": "1"
}
},
"script": {
"source": "ctx._source.age = 55"
}
}
注意:
POST和PUT都能起到创建/更新的作用
– 求知若饥,虚心若愚。