elasticSearch

一、elasticSearchjian简介

elasticSerrch简介:http://t.csdn.cn/P69HY
在这里插入图片描述
在这里插入图片描述

  • 1.什么是倒排索引

以前是根据ID查内容,倒排索引之后是根据内容查ID,然后再拿着ID去查询出来真正需要的东西。

  • 2.什么是相关性得分

根据比重获取检索数据

1.安装docker上安装elasticsearch

参考谷粒商城文档

elasticserach数据格式

在这里插入图片描述

二、elasticserach基本操作

2.1索引操作

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.2文档操作
  • 常用get查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
POST customer/external/1/_update
或者
POST customer/external/1
PUT customer/external/1

  • 不同:POST 操作会对比源文档数据,如果相同不会有什么操作,文档 version 不增加 PUT 操作总会将数据重新保存并增加
    version 版本; 带_update 对比元数据如果一样就不进行任何操作。 看场景; 对于大并发更新,不带 update;
    对于大并发查询偶尔更新,带 update;对比更新,重新计算分配规则。
  • 更新同时增加属性

POST customer/external/1/_update
{ “doc”: { “name”: “Jane Doe”, “age”: 20 }
}
PUT 和 POST 不带_update 也可以

在这里插入图片描述
在这里插入图片描述

2.3 进阶检索

在这里插入图片描述

  • 第一种

在这里插入图片描述

  • 第二种(常用)
    Query DSL
    1)、基本语法格式
    Elasticsearch 提供了一个可以执行查询的 Json 风格的 DSL(domain-specific language 领域特定语言)
}
GET bank/_search
{ "query": { "match_all": {}
},"from": 0, "size": 5, "sort": [
{ "account_number": { "order": "desc"
}
}
]
}
 query 定义如何查询,
 match_all 查询类型【代表查询所有的所有】,es 中可以在 query 中组合非常多的查
询类型完成复杂查询
 除了 query 参数之外,我们也可以传递其它的参数以改变查询结果。如 sort,size
 from+size 限定,完成分页功能
 sort 排序,多字段排序,会在前序字段相等时后续字段内部排序,否则以前序为准

2)、返回部分字段

GET bank/_search
{ "query": {
"match_all": {}
},"from": 0, "size": 5, "_source": ["age","balance"]
}

3)、match【匹配查询】
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

GET bank/_search
{ "query": { "multi_match": { "query": "mill", "fields": ["state","address"]
}
}
}
state 或者 address

在这里插入图片描述
must:必须达到 must 列举的所有条件
should:应该达到 should 列举的条件,如果达到会增加相关文档的评分,并不会改变
查询的结果。如果 query 中只有 should 且只有一种匹配规则,那么 should 的条件就会
被作为默认匹配条件而去改变查询结果
must_not 必须不是指定的情况

  • 以下查询的是 address 包含 mill,并且 gender 是 M,如果 address 里面有 Wallace 最好不过,但是 age 必须不包含 18
GET bank/_search
{
  "query": {
    "bool": {
      "must": [
        {"match": {
          "gender": "M"
        }},
        {
          "match": {
            "address": "mill"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "age": "18"
          }
        }
       
      ],
      "should": [
        {"match": {
          "lastname": "Wallace"
        }}
      ]
    }
  }
}

在这里插入图片描述
并不是所有的查询都需要产生分数,特别是那些仅用于 “filtering”(过滤)的文档。为了不
计算分数 Elasticsearch 会自动检查场景并且优化查询的执行。

查询年龄在18到30之间的数据

GET bank/_search
{
  "query": {
    "bool": {
      "filter": {
        "range": {
          "age": {
            "gte": 18,
            "lte": 30
          }
        }
      }
    }
  }
}

在这里插入图片描述
在这里插入图片描述
和 match 一样。匹配某个属性的值。全文检索字段用 match(文本内容),其他非 text 字段匹配用 term,text字段使用term非常困难。
在这里插入图片描述

在这里插入图片描述

##查出所有年龄分布,并且这些年龄段中 M 的平均薪资和 F 的平均薪资以及这个年龄
##段的总体平均薪资
GET bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageaggs": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "genderagg": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },
          "aggs": {
            "ageavg": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "balanceavg":{
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  }
}

在这里插入图片描述

2.4 Mapping在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Es7 及以上移除了 type 的概念。
关系型数据库中两个数据表示是独立的,即使他们里面有相同名称的列也不影响使用,
但 ES 中不是这样的。elasticsearch 是基于 Lucene 开发的搜索引擎,而 ES 中不同 type
下名称相同的 filed 最终在 Lucene 中的处理方式是一样的。
两个不同 type 下的两个 user_name,在 ES 同一个索引下其实被认为是同一个 filed,
你必须在两个不同的 type 中定义相同的 filed 映射。否则,不同 type 中的相同字段
名称就会在处理中出现冲突的情况,导致 Lucene 处理效率下降。
去掉 type 就是为了提高 ES 处理数据的效率。
Elasticsearch 7.x

  • URL 中的 type 参数为可选。比如,索引一个文档不再要求提供文档类型。

Elasticsearch 8.x

  • 不再支持 URL 中的 type 参数。

解决:
1)、将索引从多类型迁移到单类型,每种类型文档一个独立索引
2)、将已存在的索引下的类型数据,全部迁移到指定位置即可。详见数据迁移

在这里插入图片描述

PUT /my-index
{
  "mappings": {
    "properties": {
      "age": {
        "type": "integer"
      },
      "email": {
        "type": "keyword"
      },
      "name": {
        "type": "text"
      }
    }
  }
}
  • 不能直接在原有索引上增加,需要在映射中添加

在这里插入图片描述
在这里插入图片描述

  • 对于已经存在的映射字段,我们不能更新。更新必须创建新的索引进行数据迁移
2.5 分词

一个 tokenizer(分词器)接收一个字符流,将之分割为独立的 tokens(词元,通常是独立
的单词),然后输出 tokens 流。
例如,whitespace tokenizer 遇到空白字符时分割文本。它会将文本 “Quick brown fox!” 分割
为 [Quick, brown, fox!]。
该 tokenizer(分词器)还负责记录各个 term(词条)的顺序或 position 位置(用于 phrase 短
语和 word proximity 词近邻查询),以及 term(词条)所代表的原始 word(单词)的 start
(起始)和 end(结束)的 character offsets(字符偏移量)(用于高亮显示搜索的内容)。
Elasticsearch 提供了很多内置的分词器,可以用来构建 custom analyzers(自定义分词)

在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述

  • 在ik分词器配置文件中配置远程分词字典,将分词字典放在Nginx上,让ik分词器向Nginx发送请求,获取自定义分此词器

在这里插入图片描述
在这里插入图片描述

  • 我的自定义分词器存放的位置mydata下fenci.txt

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值