Elasticsearch使用

Text datatypes text 需要设置分词器,不指定使用默认分词器
keyword 关键字字段,索引时不分词,适用手机号\身份证\邮政编码
Numeric datatypes long  
integer  
short  
byte  
double  
float  
half_flout  
scaled_float  
Date datatypes date  
Boolean datatypes boolean  
Binary datatypes binary  
Range_datatypes integer_range  
float_range  
long_range  
double_range  
date_range  

1.创建索引库:post请求:http://localhost:9200/haha("haha"为索引库名称)

{
  "settings": {
    "index": {
      "number_of_shards": 1,//创建多少分片
      "number_of_replicas": 0//创建多少副本
    }
  }
}

2.创建映射:post请求:http://localhost:9200/haha/doc/_mapping

{  
"properties": {    
"name": {      
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"    
},
"pic": {
"type": "text",
"index": false
}  
}
}

ES8.0+提供RestClient包括:java low level rest client+java high level rest client

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.1</version>
</dependency>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>6.2.1</version>
</dependency>

若高版本有不支持的功能,引入低版本依赖

application.yml配置

elasticsearch:

  hostlist: ${eshostlist:127.0.0.1:9200}#多个节点,分隔

高级客户端初始化,低级构建RestClient

RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(
                new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));
@AutoWired
private RestHighLevelClient client;
//创建索引库
CreateIndexRequest createIndexRequest = new CreateIndexRequest("haha");
//设置参数
createIndexRequest.settings(Settings.builder().put("number_of_shards","1")
  .put("number_of_replicas","0"));
//创建映射
createIndexRequest.mapping("doc","json内容",XContentType.JSON);
//操作索引客户端
IndicesClient indices = client.indices();
CreateIndexResponse createIndexResponse = indices.create(createIndexRequest);
//得到响应
boolean acknowledged = createIndexResponse.isAcknowledged();

//新增文档
IndexRequest indexRequest = new IndexRequest("haha","doc");
indexRequest.source("json文档内容");
IndexResponse indexResponse = client.index(indexRequest);
DocWriteResponse.Result result = indexResponse.getResult();

//删除索引库
DeleteIndexRequest deleteIndexRequest = new DeleteIndexRequest("haha");
IndicesClient indices = client.indices();
DeleteIndexResponse deleteIndexResponse = indices.delete(deleteIndexRequest);
boolean acknowledged = createIndexResponse.isAcknowledged();
//更新文档
UpdateRequest updateRequest = new UpdateRequest("haha","doc",id);
updateRequest.doc("更新json内容");
UpdateResponse updateResponse = client.update(updateRequest);
RestStatus status = update.status();

//查询文档
GetRequest getRequest = new GetRequest("haha","doc","id");
GetResponse getResponse = client.get(getRequest);
boolean exists = getResponse.isExists();

SearchRequest searchRequest = new SearchRequest("haha");
searchRequest.types("doc");
SearchsourceBuilder searchSourceBuilder = new SearchSourceBuilder();
searchSourceBuilder.query(QueryBuilders.matchAllQuery());
searchSourceBuilder.query(QueryBuilders.termQuery("pic","http://..."));
searchSourceBuilder.query(QueryBuilders.termsQuery("_id",new String[]{"3"}));
searchSourceBuilder.query(QueryBuilders.matchQuery("name","java编程思想")
  .minimumShouldMatch("80%"));
searchSourceBuilder.query(QueryBuilders.minimumShouldMathch("50%")
  .multiMatchQuery("java编程思想","name","description").filed("name",5));
searchSourceBuilder.fetchSource(new String[]{"name","pic"},new String[]{});
searchSourceBuilder.form(3);
searchSourceBuilder.size(1);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
SearchHits searchHits = searchResponse.getHits();
long totalHits = searchHits.totalHits;
SearchHit[] hits = searchHits.getHits();
for(SearchHit hit:hits){
  String id = hit.getId();//文档id
  Map<String,Object> sourceAsMap = hit.getSourceAsMap();
  sourceAsMap获取字段值
}
//bool查询
SearchRequest searchRequest = new SearchRequest("haha");
searchRequest.types("doc");
SearchsourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder =QueryBuilders.termQuery("pic","http://.");
MultiMatchQueryBuilder multiMatchQueryBuilder =
  QueryBuilders.multiMatchQuery("java编程思想","name","description")
  .miniShouldMatch("80%").filed("name",5);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQueryBuilder();
boolQueryBuilder.must(termQueryBuilder);
boolQueryBuilder.must(multiMatchQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
SearchHits searchHits = searchResponse.getHits();
long totalHits = searchHits.totalHits;
SearchHit[] hits = searchHits.getHits();
for(SearchHit hit:hits){
  String id = hit.getId();//文档id
  Map<String,Object> sourceAsMap = hit.getSourceAsMap();
  sourceAsMap获取字段值
}
//过滤器
SearchRequest searchRequest = new SearchRequest("haha");
searchRequest.types("doc");
SearchsourceBuilder searchSourceBuilder = new SearchSourceBuilder();
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("catagory","工具书");
RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("price").gte(20);
MultiMatchQueryBuilder multiMatchQueryBuilder =
  QueryBuilders.multiMatchQuery("java编程思想","name","description")
  .miniShouldMatch("80%").filed("name",5);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQueryBuilder();
boolQueryBuilder.must(multiMatchQueryBuilder);
boolQueryBuilder.filter(termQueryBuilder);
boolQueryBuilder.filter(rangeQueryBuilder);
searchSourceBuilder.query(boolQueryBuilder);
searchSourceBuilder.sort("price",SortOrder.ASC);
HighLightBuilder highLightBuilder = new HighLightBuilder();
highLightBuilder.perTags("<tag>");
highLightBuilder.postTags("<tags>");
highLightBuilder.fileds.add(HighLightBuilder.Filed("name"));
highLightBuilder.fileds.add(HighLightBuilder.Filed("description"));
searchSourceBuilder.highLighter(highLightBuilder);
searchRequest.source(searchSourceBuilder);
SearchResponse searchResponse = client.search(searchRequest);
SearchHits searchHits = searchResponse.getHits();
long totalHits = searchHits.totalHits;
SearchHit[] hits = searchHits.getHits();
for(SearchHit hit:hits){
  String id = hit.getId();//文档id
  Map<String,Object> sourceAsMap = hit.getSourceAsMap();
  sourceAsMap获取字段值
  String name = null;
  Map<String,HighLightFiled> hightLightFiledMap = shit.getHighLightFileds();
  if(highLightFiledMap != null){
    HighLightFiled highLightName = highLightFiledMap.get("name");
    if(highLightName != null){
      Text[] nameText = highLightName.getFragments();
      StringBuffer sb = new SB();
      for(Text text:nameText){
        sb.append(text)
      }
      name = sb.toString();
    }
  }
}

3.测试分词器:post请求:http://localhost:9200/_analyze

 {"text":"正在测试ES分词器"}

4.创建文档:put或post请求:http://localhost:9200/haha/doc/id(如果不指定id,ES会自动生成)

 {"name":"ES学习","pic":"http://..."}

5.更新文档:先检索到文档,将原来文档标记为删除,创建新文档(重建索引),删除旧文档

完全替换:post请求:http://localhost:9200/haha/doc/id

 {"name":"ES学习","pic":"http://...."}

局部更新:post请求:http://localhost:9200/haha/doc/id/_update

 {"pic":"http://...."}

 6.删除文档:

根据id删除:delete请求:http://localhost:9200/haha/doc/id

匹配删除:post请求:http://localhost:9200/haha/doc/_delete_by_query

{
  "query": {
    "term": {
      "pic": "http://...."
    }
  }
}

7.查询文档:get请求:http://localhost:9200/haha/doc/_search?q=name:开发

post请求:http://localhost:9200/haha/doc/_search?

{
  "from": 0,
  "size": 1,
  "query": {
    "match_all": {}  
  },
  "source": ["name", "pic"]
}

term用于精确查询 不分词

{
  "query": {
    "term": {
      "pic": "http://...."
    }
  }

}

通过id查询

{
  "query": {
    "ids": {
      "type": "doc",
      "values": ["3", "4", "7"]
    }
  }
}

通过match查询:全文检索

 

{
  "query": {
    "match": {
      "name": "java编程思想",
      "operator": "or"
    }
  }
}

通过multi_match查询:

{
  "query": {
    "multi_match": {
      "query": "java编程思想",
      "minimum_should_match": "80%", //分词(3)*0.8=2.4向上取整为2,三个词需要有两个匹配才被筛选出来
      "fileds": ["name^5", "description"]
    }
  }
}

bool查询

{
  "query": {
    "bool": {
      "must": [{
        "nultimatch": {
          "query": "java编程思想",
          "minimum_should_match": "80%",
          "fileds": ["name", "description"]
        },
        "term": {
          "catagory": "工具书"
        }
      }]
    }
  }
}

过滤器

{
  "query": {
    "bool": {
      "must": [{
        "nultimatch": {
          "query": "java编程思想",
          "minimum_should_match": "80%",
          "fileds": ["name", "description"]
        }
      }],
      "fileter": [{
        "term": {
          "catagory": "工具书"
        },
        "range": {
          "price": {
            "gte": 20,
            "lte": 50
          }
        }
      }]
    }
  },

  "sort": [{
    "price": "asc"
  }],
  "highlight": {
    "pre_tags": ["<tag>"],
    "post_tags": ["<tag>"],
    "fileds": {
      "name": {},
      "description": {}
    }
  }

}

posted @ 2020-01-22 21:00  袋子里的袋鼠  阅读(388)  评论(0)    收藏  举报