ElasticSearch学习随笔之简单操作

ElasticSearch

1、ElasticSearch学习随笔之基础介绍
2、ElasticSearch学习随笔之简单操作
3、ElasticSearch学习随笔之java api 操作
4、ElasticSearch学习随笔之SpringBoot Starter 操作
5、ElasticSearch学习随笔之嵌套操作
6、ElasticSearch学习随笔之分词算法
7、ElasticSearch学习随笔之高级检索

ElasticSearch,创始人 Shay Banon(谢巴农)
本文主要讲解ElasticSearch 基础操作,Kibana 以及 java api 调用操作。


文章目录

  • ElasticSearch
  • 前言
  • 一、分词器测试
  • 二、索引的增删改
    • 2.1 新建索引
      • 2.1.1 新建最简单的 index
      • 2.1.2 新建带 mapping 的 index
    • 2.2 删除索引
    • 2.3 给 index 起别名
    • 2.4 拷贝索引
  • 三 索引内容的增删改查
    • 3.1 bulk 批量添加数据
    • 3.2 bulk 批量修改数据
    • 3.2(补) _update_by_query 按条件修改数据
    • 3.3 按照id获取数据
    • 3.4 match_all 匹配所有数据
    • 3.5 term 精准搜索
    • 3.6 match 匹配搜索
    • 3.7 multi_match 多字段匹配
    • 3.8 query_string 多值匹配
    • 3.9 range 范围匹配
    • 3.10 match_phrase 短语匹配
    • 3.11 prefix 前缀匹配
    • 3.12 filter 过滤
    • 注:
  • 四 高级搜索
    • 4.1 highlight 高亮匹配
    • 4.2 组合高亮匹配
    • 4.3 聚合统计
    • 4.4 scroll 游标查询
    • 4.5 模板查询
  • 4.6 模板重复使用
  • 五 关联查询
    • 5.1 新建index, mapping创建
    • 5.2 插入数据
    • 5.3 查找 001 博客(按照主表查询)
    • 5.4 按照博客主题查询 (按照主表查询)
    • 5.4 按照评论者用户名查询 (按照从表查询)
  • 总结


前言

本文主要对ElasticSearch基础操作进行讲解,以便上手 用 ElasticSearch


一、分词器测试

在安装完 ES 之后,新建 索引 的时候,可以指定 分词器,首先对分词器进行一个测试。

POST /_analyze
{
  "analyzer": "standard",
  "text":"最好的时代,最坏的时代"
}

二、索引的增删改

2.1 新建索引

2.1.1 新建最简单的 index

如果不指定 mapping, ES 会自动添加上 mapping。

PUT /<索引名称>

2.1.2 新建带 mapping 的 index

PUT /<index name>
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 2
  },
  "mappings": {
    "data": {
      "properties": {
        "product_name": {
          "type": "text",
          "index": true,
          "store": true,
          "analyzer": "standard"
        },
        "product_agency": {
          "type": "keyword",
          "index": true,
          "store": true
        },
        "notice_type": {
          "type": "keyword",
          "index": true,
          "store": true
        },
        "notice_type_id": {
          "type": "integer",
          "index": true,
          "store": true
        }
      }
    }
  }
}

type:字段类型 ,index:是否建立索引,store:是否存储
特别说明:在 7.x 版本后,在 mapping 中不用指定数据类型 data 。

2.2 删除索引

DELETE <索引名称>

2.3 给 index 起别名

PUT /<索引名称>/_alias/<别名>

2.4 拷贝索引

POST _reindex
{
  "source": {
    "index": "learn_test"
  },
  "dest": {
    "index": "learn_test2"
  }
}

三 索引内容的增删改查

3.1 bulk 批量添加数据

POST /tender_test/_bulk
{"index":{"_index":"tender_test","_type":"data"}}
{"product_agency":"山东方中工程管理有限公司","notice_type_id":"23","product_name":"血培养仪","notice_type":"招标公告"}
{"index":{"_index":"tender_test","_type":"data"}}
{"product_agency":"","notice_type_id":"3","product_name":"全自动微生物鉴定药敏分析仪","notice_type":"招标公告"}

3.2 bulk 批量修改数据

使用 _bulk 来修改数据时,注意,它是整体覆盖的,每次修改需要把全部的字段都包含了,要不就丢数据了。

POST /<索引名称>/_bulk
{"index":{"_index":"tender_test","_type":"data","_id":"bj5pNYABu8HGt75FTQyX"}}
{"product_agency":"山东方中工程管理有限公司","notice_type_id":"230","product_name":"血培养仪","notice_type":"招标公告"}
{"index":{"_index":"tender_test","_type":"data","_id":"bz5pNYABu8HGt75FTQyX"}}
{"product_agency":"","notice_type_id":"31","product_name":"全自动微生物鉴定药敏分析仪","notice_type":"招标公告"}

3.2(补) _update_by_query 按条件修改数据

前段时间在支持运营部分修改数据时,发现需要修改部分数据,而且按照特定的条件,不能用 bulk,那就是能用 _update_by_search 来搞定了,query 是需要修改数据的条件,script 里面则是具体修改的内容,是用脚本的方式来实现的,紧急情况下还是蛮不错的,要不就的推数据了,很慢。

POST /<索引名称>/data/_update_by_query
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "notice_type_id": "3"
          }
        }
      ]
    }
  },
  "script":{
    "source":"[ctx._source['product_agency']=\"1\",ctx._source['notice_type']=\"招标公告2\",ctx._source['redmine']=\"\"]"
  }
}

单个值修改(ES 7.x 版本操作)

POST electronics/_update_by_query
{
  "query": {
    "term": {
      "_id": {
        "value": "6"
      }
    }
  },
  "script":{
    "source":"ctx._source['product_count']=3"
  }
}

3.3 按照id获取数据

这里的 data 是文档类型,ES7 之前,文档类型是自己定义的,但是到了 ES7.x 之后,改为了 _doc 了,默认可以不写。

GET <索引名称>/data/bj5pNYABu8HGt75FTQyX

3.4 match_all 匹配所有数据

POST /tender_test/_search
{
  "query": {
    "match_all": {}
  }
}

3.5 term 精准搜索

POST /<索引名称>/_search
{
  "query":{
    "term":{
      "notice_type": "招标公告"
    }
  }
}

3.6 match 匹配搜索

POST tender_test/_search
{
  "from": 0,
  "size": 20,
  "query": {
    "match": {
      "product_name": "鉴定"
    }
  }
}

3.7 multi_match 多字段匹配

POST <索引名称>/_search
{
  "query": {
    "multi_match": {
      "query": "微生物",
      "fields": ["product_name","product_agency"]
    }
  }
}

3.8 query_string 多值匹配

POST tender_test/data/_search
{
  "query": {
    "query_string": {
      "query": "国际 OR 过敏"
    }
  }
}

当然 and 就是: “query”: “国际 AND 过敏”。

3.9 range 范围匹配

POST <索引名称>/_search
{
  "query": {
    "range": {
      "notice_type_id": {
        "gte": 5,
        "lte": 9
      }
    }
  }
}

3.10 match_phrase 短语匹配

POST tender_test/data/_search
{
  "query": {
    "match_phrase": {
      "product_agency": "四川省工程项目管理咨询有限公司"
    }
  }
}

3.11 prefix 前缀匹配

POST tender_test/_search
{
  "query": {
    "prefix": {
      "notice_type": "招标"
    }
  }
}

3.12 filter 过滤

POST <索引名称>/_search
{
  "query": {
    "bool": {
      "filter": {
        "term": {
          "notice_type_id": "5"
        }
      }
    }
  }
}

注:

此处有个面试题,filter 过滤 和 query 匹配区别是什么?
后文补充

四 高级搜索

4.1 highlight 高亮匹配

POST <索引名称>/data/_search
{
  "query": {
    "match": {
      "product_name": "分析仪"
    }
  },
  "highlight": {
    "fields": {
      "product_name": { },
      "product_agency": {}
    }
  }
}

4.2 组合高亮匹配

POST <索引名称>/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "product_name": "分析仪"
          }
        },
        {
          "match": {
            "product_agency": "分析仪"
          }
        }
      ]
    }
  },
  "highlight": {
    "fields": {
      "product_name": {},
      "product_agency": {}
    }
  }
}

4.3 聚合统计

POST <索引名称>/_search
{
  "query": {
    "match": {
      "notice_type_id": "20"
    }
  }, 
  "aggs": {
    "groyp_by_notice_type": {
      "terms": {
        "field": "notice_type",
        "order": {
          "_count": "desc"
        }
      },
      "aggs": {
        "groyp_by_notice_type_id": {
          "terms": {
            "field": "notice_type_id",
            "order": {
              "_count": "desc"
            }
          }
        }
      }
    }
  },
  "size": 0
}

4.4 scroll 游标查询

POST <索引名称>/data/_search?scroll=1m
{
  "query": {
    "multi_match": {
      "query": "国际",
      "fields": ["product_name","product_agency"]
    }
  },
  "size": 2
}

首先在查询的时候,可以带上 scroll=1m 参数,在url 中,查询结果中可以拿到 _scroll_id 的值,就是一个长字符串,再用这个字符串直接查询就可以了,如下:

GET _search/scroll?scroll=1m
{
  "scroll_id":"DnF1ZXJ5VGhlbkZldGNoBgAAAAAAAkF1Flh1eDNRcmpvUkVXVHJXSDMxV3BSdGcAAAAAAAJBeBZYdXgzUXJqb1JFV1RyV0gzMVdwUnRnAAAAAAACQXQWWHV4M1Fyam9SRVdUcldIMzFXcFJ0ZwAAAAAAAkF3Flh1eDNRcmpvUkVXVHJXSDMxV3BSdGcAAAAAAAJBdhZYdXgzUXJqb1JFV1RyV0gzMVdwUnRnAAAAAAACQXkWWHV4M1Fyam9SRVdUcldIMzFXcFJ0Zw=="
}

多用于翻页查询中。

4.5 模板查询

POST <索引名称>/_search/template
{
  "source": {
    "query": {
      "range": {
        "notice_type_id": {
          "gte": "{{start}}",
          "lte": "{{end}}"
        }
      }
    }
  },
  "params": {
    "start": 10,
    "end": 20
  }
}

4.6 模板重复使用

首先报错查询模板到 ES 中

POST _scripts/test
{
  "script":{
     "lang": "mustache",
     "source":{
       "query":{
         "match":{
           "product_name":"{{pn}}|"
         }
       }
     }
  }
}

然后再通过模板传参查询

GET tender_data/_search/template
{
  "id":"test",
  "params": {
    "pn":"分析仪"
  }
}

五 关联查询

5.1 新建index, mapping创建

PUT fashion_bolog
{
  "mappings": {
    "data": {
      "properties": {
        "blog_comments_relation": {
          "type": "join",
          "relations": {
            "blog": "comment"
          }
        },
        "title": {
          "type": "keyword"
        },
        "content": {
          "type": "text"
        }
      }
    }
  }
}

新添加的 index 名是 fashion_bolog,在 mapping 中添加了 blog 和 comment 的关系,在后面的插入数据的时候,首先插入 blog 数据,然后为没调 blog 数据插入它的子数据,并且添加上依赖关系,blog 被称为是 主表,comment 就是子表。

5.2 插入数据

下面插入了两条主表 blog 的数据。(两条博客)

PUT fashion_bolog/data/001
{
  "title":"Nice day",
  "content":"Today is a nice day, play game and eat fish",
  "blog_comments_relation":{
    "name":"blog"
  }
}

PUT fashion_bolog/data/002
{
  "title":"今天学习了啥",
  "content":"今天学习了怎么用全文搜索技术Elasticsearch",
  "blog_comments_relation":{
    "name":"blog"
  }
}

下面为 id 是 001 的博客添加了几条评论,comment_x 是评论的 id, routing 指定关联的主表的数据的 id。

PUT fashion_bolog/data/comment_2?routing=001
{
  "comment":"I m glad to hear that, good luck",
  "username":"stephen",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"001"
  }
}

PUT fashion_bolog/data/comment_3?routing=001
{
  "comment":"Really, that good",
  "username":"anji",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"001"
  }
}

PUT fashion_bolog/data/comment_4?routing=001
{
  "comment":"phen have a nice life",
  "username":"zhenglei",
  "blog_comments_relation":{
    "name":"comment",
    "parent":"001"
  }
}

5.3 查找 001 博客(按照主表查询)

下面查找 id 是 001 的博客的评论,使用 parent_id 查询主表。

POST fashion_bolog/_search
{
  "query": {
    "parent_id":{
      "type":"comment",
      "id":"001"
    }
  }
}

5.4 按照博客主题查询 (按照主表查询)

下面查询了博客名称为 “Nice day” 的博客的评论。

POST fashion_bolog/_search
{
  "query": {
    "has_parent": {
      "parent_type": "blog",
      "query": {
        "match": {
          "title": "Nice day"
        }
      }
    }
  }
}

5.4 按照评论者用户名查询 (按照从表查询)

下面查询了评论的用户名是 “zhenglei” 的博客。

POST fashion_bolog/_search
{
  "query": {
    "has_child": {
      "type": "comment",
      "query": {
        "match":{
          "username":"zhenglei"
        }
      }
    }
  }
}

总结

例如:以上就是在 kibana 中操作 index 的常规操作,工作中基本可以满足,语法记录在此,方便copy 出来在工作里面用,比较这语法还是写起来很费时的,这不耽误加班吗。

你可能感兴趣的:(搜索引擎,JAVA后台,java,elasticsearch,数据库,数据库架构,lucene)