1. 创建Maven工程,引入ElasticSearch坐标
导入坐标
<?xml version="1.0" encoding="UTF-8"?>
4.0.0
<groupId>com.itheima</groupId>
<artifactId>elasticsearch_demo</artifactId>
<version>1.0-SNAPSHOT</version>
<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>
</dependencies>
1.1.1. 新建索引+添加文档-方式1(map)
使用创建索引(index)+类型(type)+自动创建映射(Elasticsearch帮助我们根据存储的字段自动建立映射,后续讲完分词器后,手动建立映射)
步骤:
/*1.创建客户端访问对象-TransportClient/
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
//4.准备索引-client.prepareIndex(索引名,类型名,文档id)
//5.准备数据(域与映射)-indexRequestBuilder.setSource(map)
//6.执行保存索引与文档-indexRequestBuilder.get()
//7.输出执行结果-response.sout()
//8.关闭客户端-client.close()
创建包,com.itheima.es.test,创建类TestElasticSearch.java
public class TestElasticsearch {
@Test
//创建索引
public void testCreateIndex() throws Exception{
/**
* 1.创建客户端访问对象-TransportClient
* Settings表示集群的设置
* Settings.EMPTY:表示没有集群的配置(单节点)
* Settings.builder().build():表示连接的是集群环境(多节点)
*/
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300);
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
client.addTransportAddress(address);
//4.准备索引-client.prepareIndex(索引名,类型名,文档id)
IndexRequestBuilder indexRequestBuilder = client.prepareIndex("blog", "article", "1");
//5.准备数据(域与映射)-indexRequestBuilder.setSource(map)
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("title", "什么是Elasticsearch?");
map.put("content", "ElasticSearch是一个基于Lucene的搜索服务器");
indexRequestBuilder.setSource(map);
//6.执行保存索引与文档-indexRequestBuilder.get()
IndexResponse response = indexRequestBuilder.get();
//7.输出执行结果-response.sout()
System.out.println(response);
//8.关闭客户端-client.close()
client.close();
}
}
如果创建索引的时候,插入数据过慢,可以在elasticsearch服务器的上方点击右键->属性,将“快速编辑模式”的复选框的对勾去掉。(一般是设置es内存太小才会慢)
1.1.2. head插件查看索引信息
http://localhost:9100
查看数据
1.1.3. Article文章信息在es中存储的内容
1.1.4. (推荐)新建索引+添加文档-方式2(XContentBuilder)
在原有添加索引代码基础上修改第4步准备索引与第5步准备数据(域与映射)
@Test
//创建索引
public void testCreateIndex() throws Exception{
/**
* 1.创建客户端访问对象-TransportClient
* Settings表示集群的设置
* Settings.EMPTY:表示没有集群的配置(单节点)
* Settings.builder().build():表示连接的是集群环境(多节点)
*/
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(“127.0.0.1”), 9300);
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
client.addTransportAddress(address);
//方式1:map
//4.准备索引-client.prepareIndex(索引名,类型名,文档id)
/*IndexRequestBuilder indexRequestBuilder = client.prepareIndex("blog", "article", "1");
//5.准备数据(域与映射)-indexRequestBuilder.setSource(map)
Map<String, Object> map = new HashMap<String, Object>();
map.put("id", 1);
map.put("title", "什么是Elasticsearch?");
map.put("content", "ElasticSearch是一个基于Lucene的搜索服务器");
indexRequestBuilder.setSource(map);*/
//方式2:XContentBuilder(推荐)
//4.准备索引-client.prepareIndex(索引名,类型名,文档id)
IndexRequestBuilder indexRequestBuilder = client.prepareIndex("blog", "article", "2");
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject() //{
.field("id",2)
.field("title","2什么是Elasticsearch")
.field("content","2ElasticSearch是一个基于Lucene的搜索服务器")
.endObject(); //}
indexRequestBuilder.setSource(builder);
//6.执行保存索引与文档-indexRequestBuilder.get()
IndexResponse response = indexRequestBuilder.get();
//7.输出执行结果-response.sout()
System.out.println(response);
//8.关闭客户端-client.close()
client.close();
}
1.2. 搜索文档数据
1.2.1. ID查询(不走索引)
//根据文档id查询
@Test
public void testGetById() throws Exception{
/**
* 1.创建客户端访问对象-TransportClient
* Settings表示集群的设置
* Settings.EMPTY:表示没有集群的配置(单节点)
* Settings.builder().build():表示连接的是集群环境(多节点)
*/
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(“127.0.0.1”), 9300);
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
client.addTransportAddress(address);
//查询
GetResponse response = client.prepareGet(“blog”, “article”, “1”).get();
//7.输出执行结果-response.sout()
System.out.println("文章json: " + response.getSourceAsString());
System.out.println(“获取title:” + response.getSource().get(“title”));
//8.关闭客户端-client.close()
client.close();
}
1.2.2. 查询全部(不走索引)
//查询所有
@Test
public void testGetAll() throws Exception{
//1.创建客户端访问对象-TransportClient
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(“127.0.0.1”), 9300);
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
client.addTransportAddress(address);
//查询所有
SearchResponse response = client.prepareSearch("blog").setTypes("article")
.setQuery(QueryBuilders.matchAllQuery()).get();
//7.输出执行结果-response.sout()
SearchHits hits = response.getHits();
System.out.println("总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits.getHits()) {
System.out.println("文章json: " + hit.getSourceAsString());
System.out.println("获取title:" + hit.getSource().get("title"));
System.out.println("-------------------------------------------------");
}
//8.关闭客户端-client.close()
client.close();
}
1.2.3. 字符串查询(条件分词)
//字符串查询
@Test
public void testGetByString() throws Exception{
//1.创建客户端访问对象-TransportClient
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(“127.0.0.1”), 9300);
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
client.addTransportAddress(address);
//查询所有
SearchResponse response = client.prepareSearch(“blog”).setTypes(“article”)
/*QueryBuilders.queryStringQuery(“搜索”)默认匹配所有域
* 如果如果添加.field(“content”):表示只在content字段进行搜索
* */
.setQuery(QueryBuilders.queryStringQuery(“搜索”).field(“content”)).get();
//7.输出执行结果-response.sout()
SearchHits hits = response.getHits();
System.out.println(“总记录数:” + hits.getTotalHits());
for (SearchHit hit : hits.getHits()) {
System.out.println(“文章json: " + hit.getSourceAsString());
System.out.println(“获取title:” + hit.getSource().get(“title”));
System.out.println(”-------------------------------------------------");
}
//8.关闭客户端-client.close()
client.close();
}
1.2.4. 词条查询(条件不分词)
//字符串查询
//词条查询
@Test
public void testGetByString() throws Exception{
//1.创建客户端访问对象-TransportClient
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(“127.0.0.1”), 9300);
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
client.addTransportAddress(address);
//查询所有
SearchResponse response = client.prepareSearch("blog").setTypes("article")
/*
* QueryBuilders.queryStringQuery("搜索")默认匹配所有域
* 如果如果添加.field("content"):表示只在content字段进行搜索
* */
//.setQuery(QueryBuilders.queryStringQuery("搜索").field("content")).get();
.setQuery(QueryBuilders.termQuery("content","搜索")).get();
//7.输出执行结果-response.sout()
SearchHits hits = response.getHits();
System.out.println("总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits.getHits()) {
System.out.println("文章json: " + hit.getSourceAsString());
System.out.println("获取title:" + hit.getSource().get("title"));
System.out.println("-------------------------------------------------");
}
//8.关闭客户端-client.close()
client.close();
}
搜不到结果:为什么?
1.2.5. 模糊查询(通配符查询)
*:表示所有的任意的多个字符组成
?:表示1个任意的字符
//模糊查询(通配符查询)
@Test
public void testWildcardQuery() throws Exception{
//1.创建客户端访问对象-TransportClient
TransportClient client = new PreBuiltTransportClient(Settings.EMPTY);
//2.创建Elasticsearch连接对象-new InetSocketTransportAddress(InetAddress.getByName(地址), 端口号)
InetSocketTransportAddress address = new InetSocketTransportAddress(InetAddress.getByName(“127.0.0.1”), 9300);
//3.指定Elasticsearch连接地址与端口-client.addTransportAddress(address)
client.addTransportAddress(address);
//查询所有
SearchResponse response = client.prepareSearch("blog").setTypes("article")
/*
* "*":表示所有的任意的多个字符组成
* "?":表示1个任意的字符
* */
.setQuery(QueryBuilders.wildcardQuery("content","*?*")).get();
//7.输出执行结果-response.sout()
SearchHits hits = response.getHits();
System.out.println("总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits.getHits()) {
System.out.println("文章json: " + hit.getSourceAsString());
System.out.println("获取title:" + hit.getSource().get("title"));
System.out.println("-------------------------------------------------");
}
//8.关闭客户端-client.close()
client.close();
}
1.2.6. 【总结】
词条: 就是将文本内容存入搜索服务器,搜索服务器进行分词之后的最小的词(不能再切分)
例如:“ElasticSearch是一个基于Lucene的搜索服务器”
分词(好的): ElasticSearch、是、一个、基于、Lucene、搜索、服务、服务器
默认单字分词(差的): ElasticSearch、 是、一、个、基、于、搜、索、服、务、器
为什么刚才我们使用的QueryStringQuery能搜到数据呢?搜索“全文” 能够查询到,这是为什么呢?看图: