ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

谷粒商城—全文检索—ElasticSearch(102~127)

2022-02-21 17:01:19  阅读:363  来源: 互联网

标签:account 127 hits 全文检索 ElasticSearch match address elasticsearch bank


一.ElasticSearch 简介:


1.介绍:
   1)全文搜索,属于最常见的需求,开源的 Elasticsearch 是目前,全文搜索引擎的首选。
   2)它可以快速的存储、搜索、和分析,海量的数据。
   3)Elastic 是对 Lucene 的封装,提供了 RESTful 风格API 的操作接口。开箱即用
   4)官网:
    -1:官网文档:https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html
    -2:官网中文:https://www.elastic.co/guide/cn/elasticsearch/guide/current/index.html
在这里插入图片描述

2.用途:
在这里插入图片描述

3.基本概念:
   1)Index(索引)
动词:相当于 Mysql 中的 insert。
名次:相当于 Mysql 中的 DataBase(数据库)。
   2)Type(类型)
在 Index(索引) 中,可以定义 一个/多个 Type(类型)。
类似于 Mysql 中的 Table,每一种类型的数据库,放在一起。
   3)文档 (Document)
保存在 某个索引(index)下,某种类型(Type)下的一个数据(Document)。
文档时 JSON 格式的。
文档(Document)就像是,Mysql 中的某个 Table 里面的数据。
   4)图示
在这里插入图片描述

4.检索原理:(倒排索引机制)
在这里插入图片描述

5.工作原理(官网)
在这里插入图片描述

6.索引是什么(官网)
在这里插入图片描述
7.LogStach 用途是什么(官网)
在这里插入图片描述




二.ElasticSearch 安装:


1.Docker 安装:

// 安装 Elasticsearch(存储和检索数据)
docker run -d -p 9200:9200 -p 9300:9300 
--name es -e "discovery.type=single-node" 
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:7.4.2
// 安装 Kibana(可视化检索数据)

// 安装教程:
https://www.jianshu.com/p/ac3cf42dc95e


2.

3.

4.

5.

三.ElasticSearch 入门:

         4)Docker 安装: 
                  a:安装 ElasticSearch:7.4.2 :存储和检索数据
                  b:安装  Kibana:7.4.2        :可视化,存储和检索数据
                  c:安装教程:https://www.jianshu.com/p/ac3cf42dc95e

docker run -p 9200:9200 -p 9300:9300
-e “discovery.type=single-node”
-e ES_JAVA_OPTS="-Xms128m -Xmx256m"
-v /root/mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
-v /root/mydata/elasticsearch/data:/usr/share/elasticsearch/data
-v /root/mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins
-d --name elasticsearch elasticsearch:7.4.2

docker run -e “discovery.type=single-node” -v /root/mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -e ES_JAVA_OPTS="-Xms64m -Xmx128m" -d -p 9200:9200 -p 9300:9300 --name es elasticsearch:7.4.2

–最终
docker run -d -p 9200:9200 -p 9300:9300 --name es -e “discovery.type=single-node” -e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:7.4.2
d:网址访问:Elasticsearch:http://192.168.43.189:9200/
Kibana:http://192.168.43.189:5601/

二.ElasticSearch 初步检索(RestAPI 风格):

         1)_cat:
                  a:_cat/nodes:查询 所有节点信息:
                  b:_cat/health:查询 节点 健康状况
                  c:_cat/master:查询 主节点
                  d:_cat/indices:查询 所有 索引

         2)索引一个文档(保存)(PUT/POST):
                  a:/customer/external/1



         3)查询 文档
                  a:请求:http://114.215.173.88:9200/customer/external/1
                  b:报文:

{
“_index”: “customer”, //在哪个索引
“_type”: “external”, //在哪个类型
“_id”: “1”, //记录 id
“_version”: 1, //版本号
“_seq_no”: 0, //并发控制字段,每次更新就会 +1
“_primary_term”: 1, //同上 ,主分片重新分配,如重启,就会变化
“found”: true,
“_source”: { //找到的 数据
“name”: “123”
}
}

         4)模拟并发修改(乐观锁修改):如果 if_seq_no=9&if_primary_term=1 ,则进行修改。


         5)更新文档(POST / PUT)



         6)删除文档


         7)删除索引



         8)批量 保存数据:(GET bank/account/_bulk,保存 测试数据)

三.ElasticSearch 进阶检索(Query DSL)

三.ElasticSearch 映射

四.ElasticSearch 分词 & 安装 ik 分词

五.ElasticSearch 整合 SpringBoot

Start searching | Elasticsearch Guide [7.16] | Elastic

         1)查询所有(match_all)并排序(进行分页操作,并返回部分字段):
                  a:请求信息

GET /bank/_search
{
“query”: {
“match_all”: {}
},
“sort”: [
{
“account_number”: {
“order”: “asc”
}
}
],
“from”: 0,
“size”: 2,
“_source”: [“balance”,“firstname”]
}
b:返回报文:

{
“took” : 1,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 1000,
“relation” : “eq”
},
“max_score” : null,
“hits” : [
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “0”,
“_score” : null,
“_source” : {
“account_number” : 0,
“balance” : 16623,
“firstname” : “Bradshaw”,
“lastname” : “Mckenzie”,
“age” : 29,
“gender” : “F”,
“address” : “244 Columbus Place”,
“employer” : “Euron”,
“email” : “bradshawmckenzie@euron.com”,
“city” : “Hobucken”,
“state” : “CO”
},
“sort” : [
0
]
},
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “1”,
“_score” : null,
“_source” : {
“account_number” : 1,
“balance” : 39225,
“firstname” : “Amber”,
“lastname” : “Duke”,
“age” : 32,
“gender” : “M”,
“address” : “880 Holmes Lane”,
“employer” : “Pyrami”,
“email” : “amberduke@pyrami.com”,
“city” : “Brogan”,
“state” : “IL”
},
“sort” : [
1
]
}
]
}
}
c:报文解释:

took – Elasticsearch运行查询多长时间(以毫秒为单位)
timed_out –搜索请求是否超时
_shards –搜索了多少个分片,以及成功,失败或跳过了多少个分片。
max_score –找到的最相关文件的分数
hits.total.value -找到了多少个匹配的文档
hits.sort -文档的排序位置(不按相关性得分排序时)
hits._score-文档的相关性得分(使用时不适用match_all)

         2)条件查询(match)
                  a:match :解析:
                              a:match 匹配 ,非字符串类型,做精确查询。
                              b:match 匹配,字符串类型,做 模糊查询。
                              c:匹配字符为“mill  lane”,则有 mill 会查出来,有 lane 也会查出来,进行分词操作,只是得分 低。
                  b:"address.keyword": "990 Mill Road" : 按照 精确信息查找。
                  c:请求信息:

GET bank/_search
{
“query”: {
“match”: {
“address.keyword”: “990 Mill Road”
}
}
}
GET bank/_search
{
“query”: {
“match”: {
“address”: “Mill”
},
}
}
d:返回报文:

{
“took” : 2,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 19,
“relation” : “eq”
},
“max_score” : 9.507477,
“hits” : [
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “136”,
“_score” : 9.507477,
“_source” : {
“account_number” : 136,
“balance” : 45801,
“firstname” : “Winnie”,
“lastname” : “Holland”,
“age” : 38,
“gender” : “M”,
“address” : “198 Mill Lane”,
“employer” : “Neteria”,
“email” : “winnieholland@neteria.com”,
“city” : “Urie”,
“state” : “IL”
}
},
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “970”,
“_score” : 5.4032025,
“_source” : {
“account_number” : 970,
“balance” : 19648,
“firstname” : “Forbes”,
“lastname” : “Wallace”,
“age” : 28,
“gender” : “M”,
“address” : “990 Mill Road”,
“employer” : “Pheast”,
“email” : “forbeswallace@pheast.com”,
“city” : “Lopezo”,
“state” : “AK”
}
}
]
}
}
3)短语 匹配(match_phrase):把要 匹配的词,当成一个整体(不分词),进行检索
a:请求信息:

GET bank/_search
{
“query”: {
“match_phrase”: {
“address”: “mill lane”
}
}
}
b:返回报文:

{
“took” : 5,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 1,
“relation” : “eq”
},
“max_score” : 9.507477,
“hits” : [
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “136”,
“_score” : 9.507477,
“_source” : {
“account_number” : 136,
“balance” : 45801,
“firstname” : “Winnie”,
“lastname” : “Holland”,
“age” : 38,
“gender” : “M”,
“address” : “198 Mill Lane”,
“employer” : “Neteria”,
“email” : “winnieholland@neteria.com”,
“city” : “Urie”,
“state” : “IL”
}
}
]
}
}
4)多字段匹配(multi_match)
a:multi_match 解析:address / email 里面有 mill ,就会被查出来。会对查询条件,进行分词。

"multi_match": {
  "query": "mill",
  "fields": ["address","email"]
}

​​​​​​​ b:请求信息:

GET bank/_search
{
“query”: {
“multi_match”: {
“query”: “Mill Street”,
“fields”: [“address”,“email”]
}
}
}
​​​​​​​ c:返回报文:

{
“took” : 4,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 388,
“relation” : “eq”
},
“max_score” : 6.357156,
“hits” : [
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “472”,
“_score” : 6.357156,
“_source” : {
“account_number” : 472,
“balance” : 25571,
“firstname” : “Lee”,
“lastname” : “Long”,
“age” : 32,
“gender” : “F”,
“address” : “288 Mill Street”,
“employer” : “Comverges”,
“email” : “leelong@comverges.com”,
“city” : “Movico”,
“state” : “MT”
}
},
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “970”,
“_score” : 5.4032025,
“_source” : {
“account_number” : 970,
“balance” : 19648,
“firstname” : “Forbes”,
“lastname” : “Wallace”,
“age” : 28,
“gender” : “M”,
“address” : “990 Mill Road”,
“employer” : “Pheast”,
“email” : “forbeswallace@pheast.com”,
“city” : “Lopezo”,
“state” : “AK”
}
}
]
}
}

         5)复合查询(bool)

​​​​​​​ a:bool 解析:
bool 可以用来做 复合查询,复合语句,可以合并其他任何语句,包括 复合语句。
should:应该匹配,匹配上评分靠前,不匹配上也可以。
​​​​​​​ b:请求信息:

GET bank/_search
{
“query”: {
“bool”: {
“must”: [
{
“match”: {
“gender”: “M”
}
},{
“match”: {
“address”: “mill”
}
}
],
“must_not”:
[
{
“match”: {
“age”: “38”
}
}
],
“should”: [
{
“match”: {
“lastname”: “Wallace”
}
}
]
}
}
}
​​​​​​​ c:返回报文:

{
“took” : 0,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 1,
“relation” : “eq”
},
“max_score” : 6.0824604,
“hits” : [
{
“_index” : “bank”,
“_type” : “account”,
“_id” : “970”,
“_score” : 6.0824604,
“_source” : {
“account_number” : 970,
“balance” : 19648,
“firstname” : “Forbes”,
“lastname” : “Wallace”,
“age” : 28,
“gender” : “M”,
“address” : “990 Mill Road”,
“employer” : “Pheast”,
“email” : “forbeswallace@pheast.com”,
“city” : “Lopezo”,
“state” : “AK”
}
}
]
}
}

         6)结果过滤(filter)

​​​​​​​ a:filter 解析:对结果的过滤,filter ,must_not 不会贡献 相关性得分。
​​​​​​​ b:不使用 filter 过滤:

GET bank/_search
{
“query”: {
“bool”: {
“must”: [
{
“range”: {
“age”: {
“gte”: 10,
“lte”: 20
}
}
}
]
}
}
}
​​​​​​​ c:使用 filter 过滤:

GET bank/_search
{
“query”: {
“bool”: {
“filter”: {
“range”: {
“age”: {
“gte”: 10,
“lte”: 20
}
}
}
}
}
}
​​​​​​​ d:报文分析:
使用 filter 过滤,结果相关性得分 为 0 。

         7)查询 字段中包含确切术语的文档(term)

​​​​​​​ a:term 解析:
a:您可以使用term查询根据精确的值(例如价格,产品ID或用户名)查找文档,
避免term对text字段使用查询。要搜索text字段值,请改用match查询。因为 分词 的信息查找不到。
b:和 match一样,匹配某个属性的值。
全文检索 用 match,其他 非 全文检索,用 term。
​​​​​​​ b:请求信息:

GET bank/_search
{
“query”: {
“term”: {
“address”: {
“value”: “990 Mill Road”
}
}
}
}
​​​​​​​ c:返回报文:

{
“took” : 0,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 0,
“relation” : “eq”
},
“max_score” : null,
“hits” : [ ]
}
}

四.ElasticSearch 进阶检索(aggregation 执行聚合)
1)聚合 介绍
​​​​​​​ a:聚合:提供了 从数据中,分组 和 提取数值 的能力。大致等于 SQL 中,GROUP BY / 和 SQL聚合函数。

         2)搜索 address 中 ,包含 mill 的,所有人,年龄分布和平均年龄,不显示这些人详情。

​​​​​​​ a:请求

GET bank/_search
{
“query”: {
“match”: {
“address”: “mill”
}
},
“aggs”: {
“ageAggs”: {
“terms”: {
“field”: “age”,
“size”: 10
}
},
“aggAVG”:{
“avg”: {
“field”: “age”
}
}
}
}
​​​​​​​ b:返回报文

{
“took” : 2,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 4,
“relation” : “eq”
},
“max_score” : 5.4032025,
“hits” : [

]
},
“aggregations” : {
“aggAVG” : {
“value” : 34.0
},
“ageAggs” : {
“doc_count_error_upper_bound” : 0,
“sum_other_doc_count” : 0,
“buckets” : [
{
“key” : 38,
“doc_count” : 2
},
{
“key” : 28,
“doc_count” : 1
},
{
“key” : 32,
“doc_count” : 1
}
]
}
}
}
3)按照 年龄聚合,并且 求这些 年龄段的 这些人的 平均薪资。
​​​​​​​ a:请求方式:

GET bank/_search
{
“query”: {
“match_all”: {}
},
“aggs”: {
“ageAggs”: {
“terms”: {
“field”: “age”,
“size”: 2
},
“aggs”: {
“balanceAVG”: {
“avg”: {
“field”: “balance”
}
}
}
}
}
}
​​​​​​​ b:返回报文

{
“took” : 1,
“timed_out” : false,
“_shards” : {
“total” : 1,
“successful” : 1,
“skipped” : 0,
“failed” : 0
},
“hits” : {
“total” : {
“value” : 1000,
“relation” : “eq”
},
“max_score” : 1.0,
“hits” : [

]
},
“aggregations” : {
“ageAggs” : {
“doc_count_error_upper_bound” : 0,
“sum_other_doc_count” : 820,
“buckets” : [
{
“key” : 31,
“doc_count” : 61,
“balanceAVG” : {
“value” : 28312.918032786885
}
},
{
“key” : 39,
“doc_count” : 60,
“balanceAVG” : {
“value” : 25269.583333333332
}
}
]
}
}
}

四.ElasticSearch 进阶检索(mapping 映射)
1)映射介绍:
​​​​​​​ a:映射是定义 文档及其包含的字段 被 存储和索引方式的过程。(是如何被处理的)

         2)映射查询:

​​​​​​​ a:查询 所有映射:
GET bank/_mapping
​​​​​​​ b:查询结果:

{
“bank” : {
“mappings” : {
“properties” : {
“account_number” : {
“type” : “long”
},
“address” : {
“type” : “text”,
“fields” : {
“keyword” : {
“type” : “keyword”,
“ignore_above” : 256
}
}
},
“age” : {
“type” : “long”
}
}
}
}
}
3)映射修改:
​​​​​​​ a:添加 :
​​​​​​​ b:修改 :创建新的索引,再将数据迁移。

标签:account,127,hits,全文检索,ElasticSearch,match,address,elasticsearch,bank
来源: https://blog.csdn.net/qq_43056248/article/details/123048092

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有