elasticsearch简单JavaAPI总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了elasticsearch简单JavaAPI总结相关的知识,希望对你有一定的参考价值。

基于员工信息的CRUD操作

/**
 * 员工增删改查的应用程序
 * 
 * @author Administrator
 *
 */
public class EmployeeCRUDApp {

	@SuppressWarnings({ "unchecked", "resource" })
	public static void main(String[] args) throws Exception {
		// 先构建client
		Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();

		TransportClient client = new PreBuiltTransportClient(settings)
				.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

		// createEmployee(client);
		// getEmployee(client);
		// updateEmployee(client);
		// deleteEmployee(client);

		client.close();
	}

	/**
	 * 创建员工信息(创建一个document)
	 * 
	 * @param client
	 */
	private static void createEmployee(TransportClient client) throws Exception {
		IndexResponse response = client.prepareIndex("company", "employee", "1")
				.setSource(XContentFactory.jsonBuilder().startObject().field("name", "jack").field("age", 27)
						.field("position", "technique").field("country", "china").field("join_date", "2017-01-01")
						.field("salary", 10000).endObject())
				.get();
		System.out.println(response.getResult());
	}

	/**
	 * 获取员工信息
	 * 
	 * @param client
	 * @throws Exception
	 */
	private static void getEmployee(TransportClient client) throws Exception {
		GetResponse response = client.prepareGet("company", "employee", "1").get();
		System.out.println(response.getSourceAsString());
	}

	/**
	 * 修改员工信息
	 * 
	 * @param client
	 * @throws Exception
	 */
	private static void updateEmployee(TransportClient client) throws Exception {
		UpdateResponse response = client.prepareUpdate("company", "employee", "1")
				.setDoc(XContentFactory.jsonBuilder().startObject().field("position", "technique manager").endObject())
				.get();
		System.out.println(response.getResult());
	}

	/**
	 * 删除 员工信息
	 * 
	 * @param client
	 * @throws Exception
	 */
	private static void deleteEmployee(TransportClient client) throws Exception {
		DeleteResponse response = client.prepareDelete("company", "employee", "1").get();
		System.out.println(response.getResult());
	}

}

基于员工信息的查询操作

/**
 * 员工搜索应用程序
 * 
 * @author Administrator
 *
 */
public class EmployeeSearchApp {

	@SuppressWarnings({ "unchecked", "resource" })
	public static void main(String[] args) throws Exception {
		Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();

		TransportClient client = new PreBuiltTransportClient(settings)
				.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

		prepareData(client);
		// executeSearch(client);

		client.close();

	}

	/**
	 * 执行搜索操作
	 * 
	 * @param client
	 */
	private static void executeSearch(TransportClient client) {
		SearchResponse response = client.prepareSearch("company").setTypes("employee")
				.setQuery(QueryBuilders.matchQuery("position", "technique"))
				.setPostFilter(QueryBuilders.rangeQuery("age").from(30).to(40)).setFrom(0).setSize(1).get();

		SearchHit[] searchHits = response.getHits().getHits();
		for (int i = 0; i < searchHits.length; i++) {
			System.out.println(searchHits[i].getSourceAsString());
		}
	}

	/**
	 * 准备数据
	 * 
	 * @param client
	 */
	private static void prepareData(TransportClient client) throws Exception {
		client.prepareIndex("company", "employee", "1")
				.setSource(XContentFactory.jsonBuilder().startObject().field("name", "jack").field("age", 27)
						.field("position", "technique software").field("country", "china")
						.field("join_date", "2017-01-01").field("salary", 10000).endObject())
				.get();

		client.prepareIndex("company", "employee", "2")
				.setSource(XContentFactory.jsonBuilder().startObject().field("name", "marry").field("age", 35)
						.field("position", "technique manager").field("country", "china")
						.field("join_date", "2017-01-01").field("salary", 12000).endObject())
				.get();

		client.prepareIndex("company", "employee", "3")
				.setSource(XContentFactory.jsonBuilder().startObject().field("name", "tom").field("age", 32)
						.field("position", "senior technique software").field("country", "china")
						.field("join_date", "2016-01-01").field("salary", 11000).endObject())
				.get();

		client.prepareIndex("company", "employee", "4")
				.setSource(XContentFactory.jsonBuilder().startObject().field("name", "jen").field("age", 25)
						.field("position", "junior finance").field("country", "usa").field("join_date", "2016-01-01")
						.field("salary", 7000).endObject())
				.get();

		client.prepareIndex("company", "employee", "5")
				.setSource(XContentFactory.jsonBuilder().startObject().field("name", "mike").field("age", 37)
						.field("position", "finance manager").field("country", "usa").field("join_date", "2015-01-01")
						.field("salary", 15000).endObject())
				.get();
	}

}

基于员工新的聚合查询操作

/**
 * 员工聚合分析应用程序
 * 
 * @author Administrator
 *
 */
public class EmployeeAggrApp {

	@SuppressWarnings({ "unchecked", "resource" })
	public static void main(String[] args) throws Exception {
		Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build();

		TransportClient client = new PreBuiltTransportClient(settings)
				.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9300));

		SearchResponse searchResponse = client.prepareSearch("company")
				.addAggregation(AggregationBuilders.terms("group_by_country").field("country")
						.subAggregation(AggregationBuilders.dateHistogram("group_by_join_date").field("join_date")
								.dateHistogramInterval(DateHistogramInterval.YEAR)
								.subAggregation(AggregationBuilders.avg("avg_salary").field("salary"))))
				.execute().actionGet();

		Map<String, Aggregation> aggrMap = searchResponse.getAggregations().asMap();

		StringTerms groupByCountry = (StringTerms) aggrMap.get("group_by_country");
		Iterator<Bucket> groupByCountryBucketIterator = groupByCountry.getBuckets().iterator();
		while (groupByCountryBucketIterator.hasNext()) {
			Bucket groupByCountryBucket = groupByCountryBucketIterator.next();
			System.out.println(groupByCountryBucket.getKey() + ":" + groupByCountryBucket.getDocCount());

			Histogram groupByJoinDate = (Histogram) groupByCountryBucket.getAggregations().asMap()
					.get("group_by_join_date");
			Iterator<org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket> groupByJoinDateBucketIterator = groupByJoinDate
					.getBuckets().iterator();
			while (groupByJoinDateBucketIterator.hasNext()) {
				org.elasticsearch.search.aggregations.bucket.histogram.Histogram.Bucket groupByJoinDateBucket = groupByJoinDateBucketIterator
						.next();
				System.out.println(groupByJoinDateBucket.getKey() + ":" + groupByJoinDateBucket.getDocCount());

				Avg avg = (Avg) groupByJoinDateBucket.getAggregations().asMap().get("avg_salary");
				System.out.println(avg.getValue());
			}
		}

		client.close();
	}

}

注:聚合查询的时候可能出现问题:fielddata需要变为true,这个时候需要手动添加mapping

GET /company/_mapping/employee
 
{
  "company": {
    "mappings": {
      "employee": {
        "properties": {
          "age": {
            "type": "long"
          },
          "country": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "join_date": {
            "type": "date"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "position": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "salary": {
            "type": "long"
          }
        }
      }
    }
  }
}

Delete /company

上面查出来以后进行截取,修改"fielddata": true
PUT /company
{
  "mappings": {
      "employee": {
        "properties": {
          "age": {
            "type": "long"
          },
          "country": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
            "fielddata": true
          },
          "join_date": {
            "type": "date"
          },
          "name": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "position": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "salary": {
            "type": "long"
          }
        }
      }
    }
}



以上是关于elasticsearch简单JavaAPI总结的主要内容,如果未能解决你的问题,请参考以下文章

ElasticSearch的JavaAPI简单使用

[ElasticSearch] Aggregation :简单聚合查询

JavaApi操作ElasticSearch(强烈推荐)

Elasticsearch之JavaAPI操作ES

Elasticsearch JavaApi

Elasticsearch的javaAPI之query dsl-queries