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基础操作进行讲解,以便上手 用 ElasticSearch。
在安装完 ES 之后,新建 索引 的时候,可以指定 分词器,首先对分词器进行一个测试。
POST /_analyze
{
"analyzer": "standard",
"text":"最好的时代,最坏的时代"
}
如果不指定 mapping, ES 会自动添加上 mapping。
PUT /<索引名称>
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 。
DELETE <索引名称>
PUT /<索引名称>/_alias/<别名>
POST _reindex
{
"source": {
"index": "learn_test"
},
"dest": {
"index": "learn_test2"
}
}
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":"招标公告"}
使用 _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":"招标公告"}
前段时间在支持运营部分修改数据时,发现需要修改部分数据,而且按照特定的条件,不能用 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"
}
}
这里的 data 是文档类型,ES7 之前,文档类型是自己定义的,但是到了 ES7.x 之后,改为了 _doc 了,默认可以不写。
GET <索引名称>/data/bj5pNYABu8HGt75FTQyX
POST /tender_test/_search
{
"query": {
"match_all": {}
}
}
POST /<索引名称>/_search
{
"query":{
"term":{
"notice_type": "招标公告"
}
}
}
POST tender_test/_search
{
"from": 0,
"size": 20,
"query": {
"match": {
"product_name": "鉴定"
}
}
}
POST <索引名称>/_search
{
"query": {
"multi_match": {
"query": "微生物",
"fields": ["product_name","product_agency"]
}
}
}
POST tender_test/data/_search
{
"query": {
"query_string": {
"query": "国际 OR 过敏"
}
}
}
当然 and 就是: “query”: “国际 AND 过敏”。
POST <索引名称>/_search
{
"query": {
"range": {
"notice_type_id": {
"gte": 5,
"lte": 9
}
}
}
}
POST tender_test/data/_search
{
"query": {
"match_phrase": {
"product_agency": "四川省工程项目管理咨询有限公司"
}
}
}
POST tender_test/_search
{
"query": {
"prefix": {
"notice_type": "招标"
}
}
}
POST <索引名称>/_search
{
"query": {
"bool": {
"filter": {
"term": {
"notice_type_id": "5"
}
}
}
}
}
此处有个面试题,filter 过滤 和 query 匹配区别是什么?
后文补充
POST <索引名称>/data/_search
{
"query": {
"match": {
"product_name": "分析仪"
}
},
"highlight": {
"fields": {
"product_name": { },
"product_agency": {}
}
}
}
POST <索引名称>/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"product_name": "分析仪"
}
},
{
"match": {
"product_agency": "分析仪"
}
}
]
}
},
"highlight": {
"fields": {
"product_name": {},
"product_agency": {}
}
}
}
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
}
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=="
}
多用于翻页查询中。
POST <索引名称>/_search/template
{
"source": {
"query": {
"range": {
"notice_type_id": {
"gte": "{{start}}",
"lte": "{{end}}"
}
}
}
},
"params": {
"start": 10,
"end": 20
}
}
首先报错查询模板到 ES 中
POST _scripts/test
{
"script":{
"lang": "mustache",
"source":{
"query":{
"match":{
"product_name":"{{pn}}|"
}
}
}
}
}
然后再通过模板传参查询
GET tender_data/_search/template
{
"id":"test",
"params": {
"pn":"分析仪"
}
}
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 就是子表。
下面插入了两条主表 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"
}
}
下面查找 id 是 001 的博客的评论,使用 parent_id 查询主表。
POST fashion_bolog/_search
{
"query": {
"parent_id":{
"type":"comment",
"id":"001"
}
}
}
下面查询了博客名称为 “Nice day” 的博客的评论。
POST fashion_bolog/_search
{
"query": {
"has_parent": {
"parent_type": "blog",
"query": {
"match": {
"title": "Nice day"
}
}
}
}
}
下面查询了评论的用户名是 “zhenglei” 的博客。
POST fashion_bolog/_search
{
"query": {
"has_child": {
"type": "comment",
"query": {
"match":{
"username":"zhenglei"
}
}
}
}
}
例如:以上就是在 kibana 中操作 index 的常规操作,工作中基本可以满足,语法记录在此,方便copy 出来在工作里面用,比较这语法还是写起来很费时的,这不耽误加班吗。