安装
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;
}