elasticsearch 使用说明.md
简介
ElasticSearch 是一个高可用开源全文检索和分析组件。提供存储服务,搜索服务,大数据准实时分析等。一般用于提供一些提供复杂搜索的应用。
WHY(为什么选用)
- ElasticSearch 是一个准实时的搜索工具,在一般情况下延时少于一秒。
- 支持物理上的水平扩展,并拥有一套分布式协调的管理功能
- 操作比较简单
- restful 风格的API
- Elasticsearch的使用场景深入详解
REQUIREMENT (需求)
一些复杂数据的查询导出,使用传统的数据库(关系型数据库)查询以及配合java集合操作,很难解决的问题或者效率并不怎么好的问题,可以考虑使用
weakness(缺点)
- 维护工作量大
HOWTO (如何去做)
安装 & 启动
- 解压后进入到bin目录下,eg:
- 运行(binelasticsearch.bat)eg:
- 访问:http://127.0.0.1:9200/可以看到 eg:
{
"name": "bJs1ahK",
"cluster_name": "elasticsearch",
"cluster_uuid": "w0fjGOMARzuxt5K5bia07g",
"version": {
"number": "5.6.3",
"build_hash": "1a2f265",
"build_date": "2017-10-06T20:33:39.012Z",
"build_snapshot": false,
"lucene_version": "6.6.1"
},
"tagline": "You Know, for Search"
}
程序中使用
- API使用文档
- 创建client
public class ElasticSearchClient {
private volatile static TransportClient client;
private ElasticSearchClient (){}
public static TransportClient getInstanceClient() {
if (client == null) {
synchronized (TransportClient.class) {
if (client == null) {
/**
* 1. client.transport.ignore_cluster_name 时候校验服务名字 true 校验 false 不校验
* 2. client.transport.ping_timeout 链接联通时间 Defaults 5s
* 3. client.transport.nodes_sampler_interval 节点调用时间 Defaults 5s
*/
Settings settings = Settings.builder()
.put("cluster.name", "elasticsearch").build();
try {
client = new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("localhost"), 9200));
} catch (UnknownHostException e) {
e.printStackTrace();
}
}
}
}
return client;
}
}
- 创建字段映射
public class ElasticsearchIndex {
public String jsonIndex() {
String json = "{" +
"\"userId\":\"1001\"," +
"\"userName\":\"test\"," +
"\"userSex\":true" +
"\"userAge\":\"28\"" +
"}";
return json;
}
public Map mapIndex() {
Map<String, Object> json = new HashMap<String, Object>();
json.put("userId", "1001");
json.put("userName", "test");
json.put("userSex", true);
json.put("userAge", "28");
return json;
}
public byte[] objIndex() {
ObjectMapper mapper = new ObjectMapper(); // create once, reuse
User user = new User();
user.setUserId("1001");
user.setUserName("test");
user.setUserAge(28);
user.setUserSex(true);
byte[] json = new byte[0];
try {
json = mapper.writeValueAsBytes(user);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return json;
}
public String buildIndex() {
XContentBuilder builder = null;
try {
builder = jsonBuilder()
.startObject()
.field("userId", "1001")
.field("userName", "test")
.field("userSex", true)
.field("userAge", 28)
.endObject();
} catch (IOException e) {
e.printStackTrace();
}
try {
return builder.string();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
- 操作测试
新增
public void signInsert() {
TransportClient client = ElasticSearchClient.getInstanceClient();
for(int i=0;i<100;i++) {
IndexResponse response = client.prepareIndex("users", "user", ("" + i))
.setSource(ElasticsearchIndex.buildIndex()).get();
System.out.println(response.getIndex());
}
}
* 修改
public void signUpdate() {
TransportClient client = ElasticSearchClient.getInstanceClient();
UpdateRequest updateRequest = null;
try {
updateRequest = new UpdateRequest("users", "user", "2")
.doc(jsonBuilder()
.startObject()
.field("userName", "male")
.endObject());
} catch (IOException e) {
e.printStackTrace();
}
try {
UpdateResponse response = client.update(updateRequest).get();
System.out.println(response.getIndex());
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
}
根据ID删除
public void signDel(){
TransportClient client = ElasticSearchClient.getInstanceClient();
DeleteResponse response = client.prepareDelete("users", "user", "3").get();
System.out.println(response.getIndex());
}
根据查询条件删除
public void searchDel(){
TransportClient client = ElasticSearchClient.getInstanceClient();
BulkByScrollResponse response =
DeleteByQueryAction.INSTANCE.newRequestBuilder(client)
.filter(QueryBuilders.matchQuery("userName", "male"))
.source("users")
.get();
long deleted = response.getDeleted();
System.out.println(deleted);
}
查询单条
public void get(){
TransportClient client = ElasticSearchClient.getInstanceClient();
GetResponse response = client.prepareGet("users", "user", "1").get();
if(response.isExists()){
System.out.println(response.getSourceAsString());
}
System.out.println(response.getIndex());
}
批量查询
public void search(){
TransportClient client = ElasticSearchClient.getInstanceClient();
/**
* index 可以多个
* type 可以多个
*/
SearchResponse response = client.prepareSearch("users")
.setTypes("user")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(QueryBuilders.termQuery("userName", "test")) // Query
.setPostFilter(QueryBuilders.rangeQuery("userAge").from(12).to(30)) // Filter
.setFrom(0).setSize(20).setExplain(true)
.get();
System.out.println(response.getHits().getHits().length);
System.out.println(response.getHits().getAt(0).getSourceAsString());
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。