| 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": {}
}
}
}