一、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![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c5e0647bd831d414d71c4d3424798e24.png)
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