Elasticsearch

Elasticsearch

一、Elasticsearch简介

1.什么是Elasticsearch

在这里插入图片描述

2.Elasticsearch的使用案例

在这里插入图片描述

二、Elasticsearch安装与启动

1.下载ES压缩包

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.安装ES服务

在这里插入图片描述

3.启动ES服务

在这里插入图片描述
在这里插入图片描述

4.安装ES的图形化界面插件

在这里插入图片描述

三、Elasticsearch核心概念

在这里插入图片描述

1.索引

在这里插入图片描述

2.类型

在这里插入图片描述

3.字段

字段Field,相当于数据表字段,对不同属性进行分类标识

4.映射

在这里插入图片描述

5.文档

在这里插入图片描述

四、Elasticsearch的操作

在这里插入图片描述

1.安装Postman工具

在这里插入图片描述

2.下载Postman工具

在这里插入图片描述

3.注册Postman工具

在这里插入图片描述
在这里插入图片描述

4.使用Postman工具进行RESTful接口访问

Elasticsearch的RESTful接口

在这里插入图片描述

创建索引

在这里插入图片描述

创建索引时配置映射

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

创建索引后配置映射

在这里插入图片描述
在这里插入图片描述

删除索引

在这里插入图片描述
在这里插入图片描述

创建文档

在这里插入图片描述
在这里插入图片描述

修改文档

在这里插入图片描述
在这里插入图片描述

删除文档

在这里插入图片描述
在这里插入图片描述

根据id查询

在这里插入图片描述
在这里插入图片描述

querystring查询

在这里插入图片描述
在这里插入图片描述

term查询

在这里插入图片描述
在这里插入图片描述

五、IK 分词器和Elasticsearch集成使用

1.上述查询存在问题分析

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.IK分词器简介

在这里插入图片描述

3.Elasticsearch集成IK分词器

IK分词器的安装

在这里插入图片描述
在这里插入图片描述

IK分词器测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.修改索引映射mapping

重建索引

在这里插入图片描述
在这里插入图片描述

再次测试queryString查询

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

再次测试term测试

在这里插入图片描述
在这里插入图片描述

六、Elasticsearch集群

在这里插入图片描述

1.集群的相关概念

集群 cluster

在这里插入图片描述

节点 node

在这里插入图片描述

分片和复制 shards&replicas

在这里插入图片描述

2.集群的搭建

准备三台Elasticsearch服务器

创建Elasticsearch-cluster文件夹,在内部复制三个Elasticsearch服务

修改每台服务器配置

在这里插入图片描述
在这里插入图片描述

启动各个节点服务器

在这里插入图片描述
在这里插入图片描述

集群测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、ElasticSearch Java客户端

1.客户端开发环境搭建

在这里插入图片描述

2.创建索引index

在这里插入图片描述
在这里插入图片描述

3.配置索引映射mapping

在这里插入图片描述

/**
* 目标:创建索引的type的映射
* 1.获取客户端
* 2.创建mapping请求对象:需要设置index,type,请求体
* 3.创建JSON请求体:参考第一天的设置Mapping的JSON数据
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.关闭客户端
*/
@Test
public void createMapping() throws IOException, ExecutionException,
InterruptedException {
    //配置集群名称,注意采用的事情TCP接口调用
    Settings settings = Settings.builder().put("cluster.name",
"elasticsearch").build();
    //配置请求地址和端口
    InetSocketTransportAddress address = new
InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300);
    PreBuiltTransportClient client = new PreBuiltTransportClient(settings);
    client.addTransportAddress(address);
    //* 1.获取客户端
    //* 2.创建mapping请求对象:需要设置index,type,请求体
    PutMappingRequestBuilder request =
client.admin().indices().preparePutMapping("blog3");
    request.setType("article");//设置type
    //* 3.创建JSON请求体:参考第一天的设置Mapping的JSON数据
    XContentBuilder jsonBuilder = XContentFactory.jsonBuilder();
    jsonBuilder.startObject()
       .startObject("article")
       .startObject("properties")
      
.startObject("id").field("type","long").field("store","yes").field("index","not_
analyzed")
       .endObject()
      
.startObject("title").field("type","string").field("store","yes").field("index",
"analyzed").field("analyzer","ik_smart")
       .endObject()
      
.startObject("content").field("type","string").field("store","yes").field("index
","analyzed").field("analyzer","ik_smart")
       .endObject()
       .endObject()
       .endObject()
       .endObject();
    request.setSource(jsonBuilder);//设置请求体
    //* 4.请求对象执行发送请求操作,请求完成会获取响应对象
    PutMappingResponse response = request.get();
    System.out.println(response.toString());
    //* 5.关闭客户端
    client.close();
}

在这里插入图片描述

4.建立文档document

创建文档(通过XContentBuilder)
/**
* 目标:创建文档
* 1.获取客户端
* 2.创建索引设置文档请求对象:需要设置index,type,id,请求体
* 3.创建JSON请求体:参考第一天的设置创建文档的JSON数据
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.关闭客户端
*/
@Test
public void createDocument() throws IOException {
  //* 1.获取客户端:设置集群名称,设置请求地址和端口TCP的
  Settings settings = Settings.builder().put("cluster.name",
"elasticsearch").build();
  InetSocketTransportAddress address = new
InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300);
  PreBuiltTransportClient client = new PreBuiltTransportClient(settings);
  client.addTransportAddress(address);
  //* 3.创建JSON请求体:参考第一天的设置创建文档的JSON数据
  XContentBuilder jsonBuilder = XContentFactory.jsonBuilder();
  jsonBuilder.startObject()
     .field("id","1")
     .field("title","ELasticSearch是一个基于Lucene的搜索服务器")
     .field("content","content它提供了一个分布式多用户能力的全文搜索引擎,基于
RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当
前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。")
     .endObject();
  //* 2.创建索引设置文档请求对象:需要设置index,type,id,请求体
  IndexRequestBuilder requestBuilder = client.prepareIndex("blog3", "article",
"1");
  requestBuilder.setSource(jsonBuilder);
  //* 4.请求对象执行发送请求操作,请求完成会获取响应对象
  IndexResponse indexResponse = requestBuilder.get();
  System.out.println(indexResponse.toString());
  //* 5.关闭客户端
  client.close();
}

在这里插入图片描述

创建文档(使用Jackson转换实体)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.查询文档操作

关键词查询
/**
* 目标:term关键词的查询
* 1.获取客户端
* 2.创建搜索请求对象:需要设置index,type,查询对象
* 3.创建Term查询对象,设置查询字段,和关键词
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.响应对象中获取命中数据,循环遍历输出
* 6.关闭客户端
*/
@Test
public void testTermQuery() throws UnknownHostException {
  //* 1.获取客户端
  PreBuiltTransportClient client = TransPortClientUtil.getClient();
  //* 2.创建搜索请求对象:需要设置index,type,查询对象
  SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog3");
  //* 3.创建Term查询对象,设置查询字段,和关键词
  searchRequestBuilder.setQuery(QueryBuilders.termQuery("title","搜索"));
  //* 4.请求对象执行发送请求操作,请求完成会获取响应对象
  SearchResponse searchResponse = searchRequestBuilder.get();
  //* 5.响应对象中获取命中数据,循环遍历输出
  SearchHits hits = searchResponse.getHits();
  for (SearchHit hit : hits) {
    System.out.println(hit.getSourceAsString());
    System.out.println(hit.getSource().get("id"));
    System.out.println(hit.getSource().get("title"));
    System.out.println(hit.getSource().get("content"));
 }
  //* 6.关闭客户端
  client.close();
}
字符串查询
/**
* 目标:查询,带分词器的字符串查询
* 1.获取客户端
* 2.创建搜索请求对象:需要设置index,type,查询对象
* 3.创建Query_string查询对象,传入查询字符串
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.响应对象中获取命中数据,循环遍历输出
* 6.关闭客户端
*/
@Test
public void testStringQuery() throws UnknownHostException {
  //1.获取客户端
  PreBuiltTransportClient client = TransPortClientUtil.getClient();
  //2.创建搜索请求对象:需要设置index,type,查询对象
  SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2");
  searchRequestBuilder.setTypes("article");
  //3.创建Query_string查询对象,传入查询字符串
  searchRequestBuilder.setQuery(QueryBuilders.queryStringQuery("搜索"));
  //4.请求对象执行发送请求操作,请求完成会获取响应对象
  SearchResponse searchResponse = searchRequestBuilder.get();//发送请求获取响应
  //5.响应对象中获取命中数据,循环遍历输出
  SearchHits hits = searchResponse.getHits();
  System.out.println("搜索结果有:[" + hits.getTotalHits() + "]条");
  Iterator<SearchHit> iterator = hits.iterator();
  while (iterator.hasNext()){
    SearchHit next = iterator.next();
    System.out.println("ID:"+next.getSource().get("id"));
    System.out.println("title:"+next.getSource().get("title"));
    System.out.println("content:"+next.getSource().get("content"));
 }
  //6.关闭客户端
  client.close();
}
使用文档ID查询文档
/**
* 目标:查询,使用ID查询
* 1.获取客户端
* 2.创建搜索请求对象:需要设置index,type,查询对象
* 3.创建idsQuery查询对象,填入id
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.响应对象中获取命中数据,循环遍历输出
* 6.关闭客户端
*/
@Test
public void findById() throws UnknownHostException {
  //1.获取客户端
  PreBuiltTransportClient client = TransPortClientUtil.getClient();
  //2.创建搜索请求对象:需要设置index,type,查询对象
  SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog1");
  searchRequestBuilder.setTypes("article");
  //3.创建idsQuery查询对象,填入id
    searchRequestBuilder.setQuery(QueryBuilders.idsQuery().addIds("1"));
  //4.请求对象执行发送请求操作,请求完成会获取响应对象
  SearchResponse searchResponse = searchRequestBuilder.get();
  //5.响应对象中获取命中数据,循环遍历输出
  SearchHits hits = searchResponse.getHits();
  System.out.println("搜索结果有:[" + hits.getTotalHits() + "]条");
  Iterator<SearchHit> iterator = hits.iterator();
  while (iterator.hasNext()){
    SearchHit next = iterator.next();
    System.out.println("ID:"+next.getSource().get("id"));
    System.out.println("title:"+next.getSource().get("title"));
    System.out.println("content:"+next.getSource().get("content"));
 }
  //6.关闭客户端
  client.close();
}

6.查询文档分页操作

批量插入数据
/**
* 分页查询的准备:批量插入100条数据
* 1.获取客户端
* 循环100次2,3,4的操作:
* 2.创建索引新增文档请求对象:需要设置index,type,id,请求体
* 3.创建JSON请求体:参考第一天的设置创建文档的JSON数据
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.关闭客户端
*/
@Test
public void testSaveList() throws UnknownHostException, JsonProcessingException
{
  //1.获取客户端
  PreBuiltTransportClient client = TransPortClientUtil.getClient();
  ObjectMapper objectMapper = new ObjectMapper();
  //循环100次2,3,4的操作:
  for (int i = 0; i < 100; i++) {
    //3.创建JSON请求体:参考第一天的设置创建文档的JSON数据
    Article article = new Article();
    article.setId(i);
    article.setTitle("["+i+"] 搜索工作其实很快乐");
    article.setContent("["+i+"] 我们希望我们的搜索解决方案要快,我们希望有一个零配置
和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务
器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一
个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。");
    //对象转换为JSON数据
    String jsonArticle = objectMapper.writeValueAsString(article);
    //2.创建索引新增文档请求对象:需要设置index,type,id,请求体
    IndexRequestBuilder indexRequestBuilder = client.prepareIndex("blog2",
"article", "" + i);
    indexRequestBuilder.setSource(jsonArticle, XContentType.JSON);//设置请求体
    //4.请求对象执行发送请求操作,请求完成会获取响应对象
    IndexResponse indexResponse = indexRequestBuilder.get();
        System.out.println(jsonArticle);
    System.out.println(indexResponse.toString());
 }
  //5.关闭客户端
  client.close();
}

在这里插入图片描述

分页查询
/**
* 目标:查询,分页查询
* 1.获取客户端
* 2.创建搜索请求对象:需要设置index,type,查询对象
* 3.创建查询所有记录对象,并设置分页信息:form表示起始页,size表示每页多少条
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.响应对象中获取命中数据,循环遍历输出
* 6.关闭客户端
*/
@Test
public void findByPageable() throws UnknownHostException {
  //1.获取客户端
  PreBuiltTransportClient client = TransPortClientUtil.getClient();
  //2.创建搜索请求对象:需要设置index,type,查询对象
  SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2");
  searchRequestBuilder.setTypes("article");
  //3.创建查询所有记录对象,并设置分页信息:form表示起始页,size表示每页多少条
  searchRequestBuilder.setQuery(QueryBuilders.matchAllQuery());//默认每页10条
  searchRequestBuilder.setFrom(0);//form表示起始页
  searchRequestBuilder.setSize(20);//size表示每页多少条
  //4.请求对象执行发送请求操作,请求完成会获取响应对象
  SearchResponse searchResponse = searchRequestBuilder.get();
  //5.响应对象中获取命中数据,循环遍历输出
  SearchHits hits = searchResponse.getHits();
  System.out.println("搜索结果有:[" + hits.getTotalHits() + "]条");
  System.out.println("当前页有:[" + hits.getHits().length + "]条");
  Iterator<SearchHit> iterator = hits.iterator();
  while (iterator.hasNext()){
    SearchHit next = iterator.next();
        System.out.println("ID:"+next.getSource().get("id"));
    System.out.println("title:"+next.getSource().get("title"));
    System.out.println("content:"+next.getSource().get("content"));
 }
  //6.关闭客户端
  client.close();
}

在这里插入图片描述

7.查询结果高亮操作

什么是高亮显示

在这里插入图片描述
在这里插入图片描述

高亮显示的html分析

在这里插入图片描述

高亮显示代码实现
/**
* 目标:搜索结果高亮
* 1.获取客户端
* 2.创建搜索请求对象:需要设置index,type,查询对象
* 3.创建Term查询对象,设置查询字段,和关键词
* 3.1 查询对象设置数据高亮配置:配置高亮标签font,配置高亮字段title
* 4.请求对象执行发送请求操作,请求完成会获取响应对象
* 5.响应对象中获取命中数据,循环遍历输出
* 6.关闭客户端
*/
@Test
public void testHighLight() throws UnknownHostException {
  //1.获取客户端
  PreBuiltTransportClient client = TransPortClientUtil.getClient();
  //2.创建搜索请求对象:需要设置index,type,查询对象
  SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2");
  searchRequestBuilder.setTypes("article");
  //3.创建Term查询对象,设置查询字段,和关键词
  searchRequestBuilder.setQuery(QueryBuilders.termQuery("title","搜索"));//默认
每页10//3.1 查询对象设置数据高亮配置
  HighlightBuilder highlightBuilder = new HighlightBuilder();
  highlightBuilder.preTags("<font style='color:red'>");
  highlightBuilder.postTags("</font>");
  highlightBuilder.field("title");
  searchRequestBuilder.highlighter(highlightBuilder);
  //4.请求对象执行发送请求操作,请求完成会获取响应对象
  SearchResponse searchResponse = searchRequestBuilder.get();
  //5.响应对象中获取命中数据,循环遍历输出
  SearchHits hits = searchResponse.getHits();
  System.out.println("共搜索到:[" + hits.getTotalHits() + "]条结果");
  for (SearchHit hit : hits) {
    System.out.println("String方式打印高亮内容:");
    System.out.println(hit.getSourceAsString());
    System.out.println("Map方式打印高亮内容:");
    System.out.println(hit.getHighlightFields());
    Map<String, HighlightField> highlightFieldMap =
hit.getHighlightFields();
    Text[] titles = hit.getHighlightFields().get("title").fragments();
    for (Text title : titles) {
      System.out.println(title);
   }
 }
  //6.关闭客户端
  client.close();
}

在这里插入图片描述

八、Spring Data ElasticSearch 使用

1.Spring Data ElasticSearch简介

什么是Spring Data

在这里插入图片描述

什么是Spring Data ElasticSearch

在这里插入图片描述

2.Spring Data ElasticSearch环境搭建

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.itheima</groupId>
  <artifactId>itheima_elasticsearch_demo3</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.12</version>
    </dependency>
    <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>
    <dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-elasticsearch</artifactId>
      <version>3.0.5.RELEASE</version>
      <exclusions>
        <exclusion>
          <groupId>org.elasticsearch.plugin</groupId>
          <artifactId>transport-netty4-client</artifactId>
        </exclusion>
      </exclusions>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>5.0.4.RELEASE</version>
    </dependency>
  </dependencies>
</project>

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-
elasticsearch-1.0.xsd">
</beans>

在这里插入图片描述

package com.itheima.domain;
public class Article {
  private Integer id;
  private String title;
  private String content;
  public Integer getId() {
    return id;
 }
  public void setId(Integer id) {
    this.id = id;
 }
  public String getTitle() {
    return title;
 }
  public void setTitle(String title) {
    this.title = title;
 }
  public String getContent() {
    return content;
 }
  public void setContent(String content) {
    this.content = content;
 }
  @Override
  public String toString() {
    return "Article [id=" + id + ", title=" + title + ", content=" + content
+ "]";
 }
}

在这里插入图片描述

package com.itheima.dao;
import com.itheima.domain.Article;
import
org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
@Repository
public interface ArticleRepository extends ElasticsearchRepository<Article,
Integer> {
}

在这里插入图片描述

package com.itheima.service;
import com.itheima.domain.Article;
public interface ArticleService {
  public void save(Article article);
 
}
package com.itheima.service.impl;
import com.itheima.dao.ArticleRepository;
import com.itheima.domain.Article;
import com.itheima.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ArticleServiceImpl implements ArticleService {
  @Autowired
  private ArticleRepository articleRepository;
  public void save(Article article) {
    articleRepository.save(article);
 }
}

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:context="http://www.springframework.org/schema/context"
 xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
   xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/data/elasticsearch
http://www.springframework.org/schema/data/elasticsearch/spring-
elasticsearch-1.0.xsd
">
 
  <!-- 扫描Dao包,自动创建实例 -->
  <elasticsearch:repositories base-package="com.itheima.dao"/>
  <!-- 扫描Service包,创建Service的实体 -->
  <context:component-scan base-package="com.itheima.service"/>
  <!-- 配置elasticSearch的连接 -->
    <!-- 配置elasticSearch的连接 -->
  <elasticsearch:transport-client id="client" cluster-nodes="localhost:9300"
cluster-name="elasticsearch"/>
  <!-- ElasticSearch模版对象 -->
  <bean id="elasticsearchTemplate"
class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
    <constructor-arg name="client" ref="client"></constructor-arg>
  </bean>
 
</beans>  

在这里插入图片描述

package com.itheima.domain;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
//@Document 文档对象 (索引信息、文档类型 )
@Document(indexName="blog3",type="article")
public class Article {
  //@Id 文档主键 唯一标识
  @Id
  //@Field 每个文档的字段配置(类型、是否分词、是否存储、分词器 )
  @Field(store=true, index = false,type = FieldType.Integer)
  private Integer id;
 @Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type
= FieldType.text)
  private String title;
   @Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type
= FieldType.text)
  private String content;
 
  public Integer getId() {
    return id;
 }
  public void setId(Integer id) {
    this.id = id;
 }
  public String getTitle() {
    return title;
 }
  public void setTitle(String title) {
    this.title = title;
 }
  public String getContent() {
    return content;
 }
  public void setContent(String content) {
    this.content = content;
 }
  @Override
  public String toString() {
    return "Article [id=" + id + ", title=" + title + ", content=" + content
+ "]";
 }
}

在这里插入图片描述
在这里插入图片描述

package com.itheima.test;
import com.itheima.domain.Article;
import com.itheima.service.ArticleService;
import org.elasticsearch.client.transport.TransportClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringDataESTest {
  @Autowired
  private ArticleService articleService;
  @Autowired
  private TransportClient client;
  @Autowired
  private ElasticsearchTemplate elasticsearchTemplate;
  /**创建索引和映射*/
  @Test
  public void createIndex(){
    elasticsearchTemplate.createIndex(Article.class);
    elasticsearchTemplate.putMapping(Article.class);
 }
  /**测试保存文档*/
  @Test
  public void saveArticle(){
    Article article = new Article();
    article.setId(100);
    article.setTitle("测试SpringData ElasticSearch");
    article.setContent("Spring Data ElasticSearch 基于 spring data API 简化
elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装Spring Data为
Elasticsearch Elasticsearch项目提供集成搜索引擎");
    articleService.save(article);
 }
}

3.Spring Data ElasticSearch的常用操作

增删改查方法测试
package com.itheima.service;
import com.itheima.domain.Article;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
public interface ArticleService {
  //保存
  public void save(Article article);
  //删除
  public void delete(Article article);
  //查询全部
  public Iterable<Article> findAll();
  //分页查询
  public Page<Article> findAll(Pageable pageable);
}
package com.itheima.service.impl;
import com.itheima.dao.ArticleRepository;
import com.itheima.domain.Article;
import com.itheima.service.ArticleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@Service
public class ArticleServiceImpl implements ArticleService {
  @Autowired
  private ArticleRepository articleRepository;
  public void save(Article article) {
    articleRepository.save(article);
 }
  public void delete(Article article) {
    articleRepository.delete(article);
 }
  public Iterable<Article> findAll() {
    Iterable<Article> iter = articleRepository.findAll();
    return iter;
 }
  public Page<Article> findAll(Pageable pageable) {
    return articleRepository.findAll(pageable);
 }
}
package com.itheima.test;
import com.itheima.domain.Article;
import com.itheima.service.ArticleService;
import org.elasticsearch.client.transport.TransportClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:applicationContext.xml")
public class SpringDataESTest {
  @Autowired
  private ArticleService articleService;
  @Autowired
  private TransportClient client;
  @Autowired
  private ElasticsearchTemplate elasticsearchTemplate;
  /**创建索引和映射*/
  @Test
  public void createIndex(){
    elasticsearchTemplate.createIndex(Article.class);
    elasticsearchTemplate.putMapping(Article.class);
 }
  /**测试保存文档*/
  @Test
  public void saveArticle(){
    Article article = new Article();
    article.setId(100);
    article.setTitle("ELasticSearch是一个基于Lucene的搜索服务器");
    article.setContent("它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web
接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级
搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。");
    articleService.save(article);
 }
  /**测试更新*/
  @Test
  public void update(){
    Article article = new Article();
    article.setId(1001);
    article.setTitle("[更新]ELasticSearch是一个基于Lucene的搜索服务器");
    article.setContent("[更新]它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful
web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企
业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。");
    articleService.save(article);
 }
  /**测试删除*/
  @Test
  public void delete(){
    Article article = new Article();
    article.setId(1001);
    articleService.delete(article);
 }
  /**批量插入*/
  @Test
  public void save100(){
    for(int i=1;i<=100;i++){
      Article article = new Article();
      article.setId(i);
      article.setTitle(i+"elasticSearch 3.0版本发布..,更新");
      article.setContent(i+"ElasticSearch是一个基于Lucene的搜索服务器。它提供了
一个分布式多用户能力的全文搜索引擎,基于RESTful web接口");
      articleService.save(article);
   }
 }
  /**分页查询*/
  @Test
  public void findAllPage(){
    Pageable pageable = PageRequest.of(1,10);
    Page<Article> page = articleService.findAll(pageable);
    for(Article article:page.getContent()){
      System.out.println(article);
   }
 }
}
常用查询命名规则

在这里插入图片描述

查询方法测试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

使用Elasticsearch的原生查询对象进行查询
/**
* 原生查询
* 1.创建原生查询对象构建器
* 2.设置查询方式,设置分页
* 3.构建查询对象
* 4.使用ElasticSearch模板执行查询对象
*/
@Test
public void findByNativeQuery() {
  //创建一个SearchQuery对象
  SearchQuery searchQuery = new NativeSearchQueryBuilder()
    //设置查询条件,此处可以使用QueryBuilders创建多种查询
   .withQuery(QueryBuilders.queryStringQuery("备份节点上没有数
据").defaultField("title"))
    //还可以设置分页信息
   .withPageable(PageRequest.of(1, 5))
    //创建SearchQuery对象
   .build();
  //使用模板对象执行查询
  elasticsearchTemplate.queryForList(searchQuery, Article.class)
   .forEach(a-> System.out.println(a));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值