Elastcisearch使用教程

Elasticsearch使用

安装

1、Linux环境下使用docker容器安装Elasticsearch

打开终端,输入指令,此处如果之前没有pull镜像,则会为我们主动下载镜像

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

2、安装Elasticsearch可视化界面kibana

此处的路径为虚拟机的端口

 docker run --name kibana -d -p 5601:5601 --link elasticsearch -e "ELASTICSEARCH_URL=http://路径:9200" kibana:7.4.2

本地浏览器输入上述的路径+:5601端口进行安装测试
192.253.362.124:5601,若出现以下页面则说明安装成功
在这里插入图片描述

基本语法

  • 批量索引
POST /customer/_bulk
{"index":{"_id":1}}
{"name":"John"}
{"index":{"_id":2}}
{"name":"John2"}

其中customer为索引名称,在索引(名词)为customer下索引(动词,相当于插入)两个id为1和2的数据,_bulk为批量的标志。

  • 检索
GET _search
{
  "query": {
    "match_all": {}
  },
   "sort": [
    {
      "account_number": "asc"
    },
    {
      "balance": "desc"
    }
  ],
  "from": 0,
  "size": 5,
  "_source": ["firstname", "balance"]
}
  • 以后整理
##可分割匹配】
GET /bank/_search
{
  "query": {
    "match": {
      "address": "Kings"
    }
  }
}

##不可分割的短语匹配
GET /bank/_search
{
  "query": {
    "match_phrase": {
      "address": "Kings Place"
    }
  }
}

##多字段匹配
GET /bank/_search
{
  "query": {
    "multi_match": {
      "query": "mill lopezo", 
      "fields": ["address","city"]
    }
  }
}

##bool查询
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "gender": "F"
          }
        }
       
      ],
      "must_not": [
        {
          "match": {
            "age": "28"
          }
        }
      ],
      "should": [
        {
          "match": {
            "lastname": "Mcpherson"
          }
        }
      ]
    }
  }
}

##filter  与match功能差不多,但是不参与评分
GET /bank/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "range": {
            "age": {
              "gte": 20,
              "lte": 30
            }
          }
        }
      ]
    }
  }
}
GET /bank/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "range": {
            "age": {
              "gte": 20,
              "lte": 30
            }
          }
        }
      ]
    }
  }
}

##term检索 用户文字检索  精确匹配
GET /bank/_search
{
  "query": {
    "term": {
      "age": {
        "value": "30"
      }
    }
  }
}

##match 多字段查询 模糊匹配  语法:Query DSL
GET /bank/_search
{
  "query": {
    "match": {
      "address": "183 Diamond"
    }
    }
  }
}

##Aggregations  聚合  查询年龄分布
GET /bank/_search
{
  "query": {
    "match": {
      "address": "mill"
    }
    
  },
  "aggs": {
    "ageAggs": {
      "terms": {
        "field": "age",
        "size": 10
      }
    },
    "avgAggs":{
      "avg": {
        "field": "age"
      }
    },
    "balanceAggs":{
      "avg": {
        "field": "balance"
      }
    }
  },
  "size": 0
  
}
## 查询年龄段各个薪资
GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAggs": {
      "terms": {
        "field": "age",
        "size": 10
      },
      "aggs": {
        "balanceAggs": {
          "avg": {
            "field": "balance"
          }
        }
      }
    }
  
}
}

GET /bank/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "ageAggs": {
      "terms": {
        "field": "age",
        "size": 100
      },
      "aggs": {
        "genderAggs": {
          "terms": {
            "field": "gender.keyword",
            "size": 10
          },
          "aggs": {
            "balanceAggs": {
              "avg": {
                "field": "balance"
              }
            }
          }
        },
        "ageBalanceAggs":{
          "avg": {
            "field": "balance"
          }
        }
      }
      
    }
  
}
}
####mapping

GET /bank/_mapping

PUT /my_index
{
  "mappings": {
    "properties": {
      "age":{"type": "integer"},
      "email":{"type": "keyword"},
      "name":{"type": "text"}
    }
  }
  
}

##添加索引下的映射
PUT /my_index/_mapping
{
 
    "properties": {
      "emploee_id":
      {"type": "keyword",
       "index": false
      }
      
    }
  
  
}
##分词器
POST _analyze
{
  "analyzer": "standard",
  "text": "乔碧罗殿下"
}
##分词器.  ik分词器
POST _analyze
{
  "analyzer": "ik_max_word",
  "text": "乔碧罗殿下"
}

POST _analyze
{
  "analyzer": "ik_smart",
  "text": "我是中国人"
}

运用

//导入依赖
<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>elasticsearch-rest-high-level-client</artifactId>
			<version>7.4.2</version>
		</dependency>
//编写配置类
@Configuration

public class ESConfig {

    public static final RequestOptions COMMON_OPTIONS;
    static {
        RequestOptions.Builder builder = RequestOptions.DEFAULT.toBuilder();
//        builder.addHeader("Authorization", "Bearer " + TOKEN);
//        builder.setHttpAsyncResponseConsumerFactory(
//                new HttpAsyncResponseConsumerFactory
//                        .HeapBufferedResponseConsumerFactory(30 * 1024 * 1024 * 1024));
        COMMON_OPTIONS = builder.build();
    }

    @Bean
    public RestHighLevelClient esRestClient(){

//        RestHighLevelClient client = new RestHighLevelClient(
//                RestClient.builder(
//                        new HttpHost("localhost", 9200, "http") ));
        RestClientBuilder restClientBuilder = null;
        restClientBuilder = RestClient.builder(new HttpHost("192.125.354.129",9200,"http"));

        RestHighLevelClient client = new RestHighLevelClient(restClientBuilder);


        return client;

    }
}

//测试代码
@Autowired
	private RestHighLevelClient restHighLevelClient;
	@Test
	void contextLoads() {
		System.out.println(restHighLevelClient);
	}

	@Test
	void SearchTest() throws IOException {
		SearchRequest searchRequest =new SearchRequest();
		//指定索引
		searchRequest.indices("bank");
		//指定DSL 检索条件
		SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
		//构造检索条件
		searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
		System.out.println(searchSourceBuilder.toString());

		//按年龄聚合
		TermsAggregationBuilder builder = AggregationBuilders.terms("ageAggs").field("age").size(10);
		searchSourceBuilder.aggregation(builder);
		//平均薪资聚合
		AvgAggregationBuilder builder1 = AggregationBuilders.avg("balanceAgg").field("balance");
		searchSourceBuilder.aggregation(builder1);

		//将条件放入请求中
		searchRequest.source(searchSourceBuilder);
		//执行检索
		SearchResponse search = restHighLevelClient.search(searchRequest, ESConfig.COMMON_OPTIONS);
		System.out.println(search.toString());
		Map map = JSON.parseObject(search.toString(), Map.class);

		//获取所有数据
		SearchHit[] hits = search.getHits().getHits();
		for (SearchHit h : hits){
			String sourceAsString = h.getSourceAsString();
			Accout accout = JSON.parseObject(sourceAsString, Accout.class);
			System.out.println("Accout"+accout);
		}

		//获取分析信息
		Aggregations aggregations = search.getAggregations();
		Terms ageAggs = aggregations.get("ageAggs");
		for (Terms.Bucket bucket : ageAggs.getBuckets()) {
			String keyAsString = bucket.getKeyAsString();
			System.out.println("年龄: "+keyAsString +"   ->  "+bucket.getDocCount());
		}

		Avg balanceAgg = aggregations.get("balanceAgg");
		System.out.println(balanceAgg.getValue());


	}
	@Test
	void IndexTest() throws IOException {
		IndexRequest indexRequest =new IndexRequest("user");
		indexRequest.id("1");

		User user = new User();
		String s = JSON.toJSONString(user);
		indexRequest.source(s, XContentType.JSON);
		IndexResponse index = restHighLevelClient.index(indexRequest, ESConfig.COMMON_OPTIONS);

		System.out.println(index);

	}

	@Data
	class  User{
		private String name;
		private String gender;
		private Integer age;
	}

@Data
@ToString
    static class Accout
	{
		private int account_number;

		private int balance;

		private String firstname;

		private String lastname;

		private int age;

		private String gender;

		private String address;

		private String employer;

		private String email;

		private String city;

		private String state;


	}

猜你喜欢

转载自blog.csdn.net/fighting32/article/details/107683692