1. 导入maven依赖
<!--导入elasticsearch坐标-->
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
2. JavaAPI操作ElasticSearch
2.1 创建索引库
package com.pomelo.index;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itheima.domain.Article;
import org.elasticsearch.action.admin.indices.create.CreateIndexResponse;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequestBuilder;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingResponse;
import org.elasticsearch.action.delete.DeleteRequestBuilder;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequestBuilder;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
public class IndexManager {
//创建连接对象
public TransportClient getClient() throws Exception {
/**
* 1:配置es信息
* 等价与:Settings settings1 = Settings.builder().put("cluster.name","elasticsearch").build();
* 如果做集群,那么就必须使用这么上面这种定义,并且把集群名更改成自己自己设置的集群名。
*/
Settings settings = Settings.EMPTY;
//2: 创建客户端对象
TransportClient transportClient = new PreBuiltTransportClient(settings);
//3: 指定服务器的地址和ip
transportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
//返回
return transportClient;
}
@Test //创建索引库
public void createIndex() throws Exception {
//1. 获取连接
TransportClient transportClient = this.getClient();
//2. 创建索引库 http://localhost:9200/blog---put请求
CreateIndexResponse indexResponse = transportClient.admin().indices().prepareCreate("blog").get();
System.out.println(indexResponse.isShardsAcked());
//3. 释放资源
transportClient.close();
}
@Test //创建文档
public void createIndexDocument() throws Exception {
//1. 获取连接
TransportClient transportClient = this.getClient();
//2. 保存数据
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("id",1)
.field("title","elasticsearch是一个基于lucene的搜索服务")
.field("content","ElasticSearch是一个基于Lucene的搜索服务器。" +
"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" +
"Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布," +
"是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," +
"可靠,快速,安装使用方便。")
.endObject();
/**
* 把json数据储存到es索引库中
* 参数1:索引库
* 参数2:类型/分类
* 参数3:id
* 如果没有指定id,就会用uuid生成的主键id
*/
IndexRequestBuilder requestBuilder = transportClient.prepareIndex("blog", "content");
IndexResponse indexResponse = requestBuilder.setSource(contentBuilder).get();
System.out.println(indexResponse.status());
//3. 释放资源
transportClient.close();
}
@Test //基于实体类的方式创建文档数据
public void createIndexDocumentByDomain() throws Exception {
//1. 获取连接
TransportClient client = this.getClient();
//2. 保存数据
Article article = new Article();
article.setId(2);
article.setTitle("solr是一个基于lucene的搜索服务");
article.setContent("solr是一个基于Lucene的搜索服务器" +
" 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" +
" solr是用Java开发的,并作为Apache许可条款下的开放源码发布," +
" 是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," +
" 可靠,快速,安装使用方便。");
//转成json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(article);
IndexRequestBuilder requestBuilder = client.prepareIndex("blog", "content","1");
IndexResponse indexResponse = requestBuilder.setSource(json, XContentType.JSON).get();
System.out.println(indexResponse.status());
//3. 释放资源
client.close();
}
@Test //修改文档
public void updateIndexDocument() throws Exception {
//1. 获取连接
TransportClient client = this.getClient();
//2. 修改文档
Article article = new Article();
article.setId(3);
article.setTitle("elasticsearch是一个基于lucene的搜索服务");
article.setContent("elasticsearch是一个基于Lucene的搜索服务器" +
" 它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。" +
" elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布," +
" 是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定," +
" 可靠,快速,安装使用方便。");
//转成json
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(article);
UpdateRequestBuilder prepareUpdate = client.prepareUpdate("blog", "content", "1");
UpdateResponse updateResponse = prepareUpdate.setDoc(json, XContentType.JSON).get();
System.out.println(updateResponse.status());
//3. 释放资源
client.close();
}
@Test //删除文档
public void deleteIndexDocument() throws Exception {
//1. 获取连接
TransportClient client = this.getClient();
//2. 删除
DeleteRequestBuilder deleteRequestBuilder = client.prepareDelete("blog", "content", "1");
DeleteResponse deleteResponse = deleteRequestBuilder.get();
System.out.println(deleteResponse.status());
//3. 释放资源
client.close();
}
/*
//创建mapping规则
"mappings": {
"content": {
"properties": {
"id": {
"store": true,
"type": "long"
},
"title": {
"analyzer": "ik_smart",
"store": true,
"type": "text"
},
"content": {
"analyzer": "ik_smart",
"store": true,
"type": "text"
}
}
}
},
*/
@Test
public void createMapping() throws Exception {
//1. 获取连接
TransportClient client = this.getClient();
//2. 创建索引库
CreateIndexResponse indexResponse = client.admin().indices().prepareCreate("blog2").get();
//3. 如果索引库存在,就创建mapping规则
if(indexResponse.isAcknowledged()){
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder().startObject()
.startObject("content")
.startObject("properties")
.startObject("id").field("type","long").field("store",true).endObject()
//ik_max_word 最细切法(如果还能切继续切,切到没有为止) 和 ik_smart 最小切法
.startObject("title").field("type", "text").field("store", true).field("analyzer", "ik_smart").endObject()
.startObject("content").field("type", "text").field("store", true).field("analyzer", "ik_smart").endObject()
.endObject()
.endObject()
.endObject();
PutMappingRequestBuilder mappingRequestBuilder = client.admin().indices().preparePutMapping("blog2").setType("content");
PutMappingResponse mappingResponse = mappingRequestBuilder.setSource(xContentBuilder).get();
System.out.println(mappingResponse.isAcknowledged());
}
//4. 关闭资源
client.close();
}
}
2.2 全文检索
package com.pomelo.search;
import org.elasticsearch.action.index.IndexRequestBuilder;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.junit.Test;
import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;
public class SearchManager {
//创建连接
public TransportClient getClient() throws Exception {
Settings settings = Settings.EMPTY;
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
return client;
}
@Test //创建索引库
public void createIndexDocument() throws Exception {
//1. 获取连接
TransportClient client = this.getClient();
//2. 创建文档
Map<String, Object> map = new HashMap<>();
for (int i = 1; i <= 30; i++) {
map.put("id", i);
map.put("title", i + " ,elasticsearch和solr都还行");
map.put("content", i + " ,学习elasticsearch很快乐好难记");
map.put("price", i + 100);
IndexRequestBuilder requestBuilder = client.prepareIndex("blog3", "article", i + "");
IndexResponse indexResponse = requestBuilder.setSource(map).get();
System.out.println(indexResponse.status());
}
//3. 关闭资源
client.close();
}
@Test //查询
public void searchMain() throws Exception {
//1. 获取连接对象
TransportClient client = this.getClient();
/**
* 2. 查询条件:
1:查询全部 QueryBuilders.matchAllQuery()
2、字符串搜索 QueryBuilders.queryStringQuery(“elasticsearch”)
3、词条搜索 QueryBuilders.termQuery(“content”,“elasticsearch”)
4、根据ID搜索 QueryBuilders.idsQuery().addIds("1","2");
*
*/
//QueryBuilder queryBuilder = QueryBuilders.matchAllQuery();
//QueryBuilder queryBuilder = QueryBuilders.queryStringQuery("elasticsearch好多API,字符串搜索会分词");
//QueryBuilder queryBuilder = QueryBuilders.termQuery("content", "elasticsearch词条搜索不会分词");
//QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2", "3");
QueryBuilder queryBuilder = QueryBuilders.termQuery("title", "solr");
int pageNum = 1; //当前页
int pageSize = 10; //每页大小
//高亮对象
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.preTags("<span style='color:red'>"); //开始标签
highlightBuilder.field("title"); //高亮字段
highlightBuilder.postTags("</span>"); //结束标签
//3. 执行查询
SearchResponse searchResponse = client.prepareSearch("blog3") //指定搜索库 多个用逗号分开
// 指定搜索的类型,多个用逗号分开
.setTypes("article")
// 排序
.addSort("price", SortOrder.ASC)
// 分页
.setFrom((pageNum - 1) * pageSize)
.setSize(pageSize)
//设置高亮
.highlighter(highlightBuilder)
//设置搜索条件
.setQuery(queryBuilder)
// 返回
.get();
//4. 获取搜索结果
SearchHits hits = searchResponse.getHits();
System.out.println("搜索结果有:" + hits.getTotalHits() + "条数据");
for (SearchHit hit : hits) {
//索引库中的文档数据
Map<String, Object> sourceAsMap = hit.getSourceAsMap();
System.out.println("id: " + sourceAsMap.get("id"));
System.out.println("content: " + sourceAsMap.get("content"));
System.out.println("price: " + sourceAsMap.get("price"));
//获取高亮内容
if(hit.getHighlightFields() != null && hit.getHighlightFields().get("title") != null){
Text[] titles = hit.getHighlightFields().get("title").getFragments();
if(titles != null && titles.length > 0){
System.out.println("高亮内容是:" + titles[0].string());
}else {
System.out.println("title: " + sourceAsMap.get("title"));
}
}else {
System.out.println("title: " + sourceAsMap.get("title"));
}
System.out.println("=========================================================");
}
//5. 释放连接
client.close();
}
}