一.索引
1.创建索引
private String host = "127.0.0.1";
private Integer port = 9300;
//创建索引
@Test
public void testItemSearch()throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
//2.创建索引为blog2
transportClient.admin().indices().prepareCreate("blog2").get();
//关闭客户端,释放资源
transportClient.close();
}
我们创建的索引的Mapping中没有内容,我们需要自己定义
2.删除索引
//删除索引
@Test
public void deleteIndex()throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
//2.删除索引
transportClient.admin().indices().prepareDelete("blog2").get();
//关闭资源
transportClient.close();
}
二.映射
创建映射
//创建映射
@Test
public void createMappering() throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
//2.创建索引
transportClient.admin().indices().prepareCreate("blog2").get();
//2.创建映射
/*
* 格式:
* "mappings" : {
"article" : {
"properties" : {
"id" : { "type" : "string" },
"content" : { "type" : "string" },
"author" : { "type" : "string" }
}
}
}
*/
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type", "string").field("store", "yes")
.endObject()
.startObject("content")
.field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
.endObject()
.startObject("autoor")
.field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
.endObject()
.endObject()
.endObject()
.endObject();
//创建映射
PutMappingRequest mapping = Requests.putMappingRequest("blog2")
.type("article")
.source(builder);
transportClient.admin().indices().putMapping(mapping).get();
//关闭资源
transportClient.close();
}
三.文档
1.通过XContentBuilder创建文档
.
//通过XContentBuilder创建文档实体
@Test
public void createDocument()throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
//2.创建文档信息
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 1)
.field("title", "ElasticSearch是一个基于Lucene的搜索服务器")
.field("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是\n" +
"用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。")
.endObject();
//3.创建文档对象
transportClient.prepareIndex("blog2","article","1")
.setSource(builder).get();
//关闭资源
transportClient.close();
}
2.通过Jackson转化为实体
//通过映射的方式创建文档 jackson转化
@Test
public void createDocument2()throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
//2.创建文档信息
Article article = new Article();
article.setId(2);
article.setTitle("搜索工作其实很快乐");
article.setContent("我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模\n" +
"式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开\n" +
"始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解\n" +
"决所有这些问题和更多的问题。");
ObjectMapper objectMapper = new ObjectMapper();
transportClient.prepareUpdate("blog2", "article", article.getId().toString())
.setDoc(objectMapper.writeValueAsString(article)).get();
//关闭资源
transportClient.close();
}
3.修改文档
//修改文档
@Test
public void updateDocument()throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
//2.创建文档信息
Article article = new Article();
article.setId(1);
article.setTitle("搜索工作其实很快乐");
article.setContent("我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模\n" +
"式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开\n" +
"始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解\n" +
"决所有这些问题和更多的问题。");
ObjectMapper objectMapper = new ObjectMapper();
transportClient.prepareUpdate("blog2", "article", article.getId().toString())
.setDoc(objectMapper.writeValueAsString(article)).get();
//关闭资源
transportClient.close();
}
直接用update修改
4.删除文档
第一种 prepareDelete
//删除文档 两种方式 prepareDelete delete
@Test
public void deleteDocument() throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
transportClient.prepareDelete("blog2","article","1").get();
transportClient.close();
}
第二种delete
//删除blog2下的类型是article中的id为1的数据
client.delete(new DeleteRequest("blog2", "article", "1")).get();
四.查询文档分页操作
1.分页查询和排序
// 搜索数据
SearchRequestBuilder searchRequestBuilder =
transportClient.prepareSearch("blog2").setTypes("article")
.setQuery(QueryBuilders.matchAllQuery());//默认每页10条记录
//setFrom():从第几条开始检索,默认是0。
//setSize():每页最多显示的记录数。
searchRequestBuilder.setFrom(20).setSize(20);
// 排序
searchRequestBuilder.addSort("id", SortOrder.DESC);
SearchResponse searchResponse = searchRequestBuilder.get();
SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象
System.out.println("查询结果有:" + hits.getTotalHits() + "条");
Iterator<SearchHit> iterator = hits.iterator();
五.查询结果高亮显示
//查询结果高亮显示,我们一般我们在service
@Test
public void findHighter() throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(host), port));
// 搜索数据
SearchRequestBuilder searchRequestBuilder = transportClient
.prepareSearch("blog2").setTypes("article")
.setQuery(QueryBuilders.termQuery("title", "搜索"));//默认每页10条记录
//设置高亮数据
HighlightBuilder hiBuilder=new HighlightBuilder();
hiBuilder.preTags("<font style='color:red'>");
hiBuilder.postTags("</font>");
hiBuilder.field("title");
searchRequestBuilder.highlighter(hiBuilder);
//获得查询数据
SearchResponse searchResponse = searchRequestBuilder.get();
//获取查询结果集
SearchHits searchHits = searchResponse.getHits();
System.out.println("共搜到:"+searchHits.getTotalHits()+"条结果!");
//遍历结果
for(SearchHit hit:searchHits) {
System.out.println("String方式打印文档搜索内容:");
System.out.println(hit.getSourceAsString());
System.out.println("Map方式打印高亮内容");
System.out.println(hit.getHighlightFields());
System.out.println("遍历高亮集合,打印高亮片段:");
Text[] text = hit.getHighlightFields().get("title").getFragments();
for (Text str : text) {
System.out.println(str);
}
}
}