1.maven坐标的导入

<dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>2.4.0</version>
</dependency>
<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-elasticsearch</artifactId><version>2.0.4.RELEASE</version>
</dependency>

2.准备测试类 Article(添加spring data elasticsearch 注解)

@Document : 文档对象(索引信息index,文档类型mapping)
@Id : 文档主键,唯一标识
@Field : 每个文档的域配置

index = FieldIndex.not_analyzed : 不分词
index = FieldIndex.analyzed : 分词
index = FieldIndex.not : 不创建索引
analyzer = “ik” : 指定使用的分词器
store = true : 是否保存
searchAnalyzer = “ik” : 查询所使用的分词器
type = FieldType.String : 指定域的类型

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.FieldIndex;
import org.springframework.data.elasticsearch.annotations.FieldType;@Document(indexName = "blog3", type = "article")
public class Article {@Id@Field(index = FieldIndex.not_analyzed, store = true, type = FieldType.Integer)private Integer id;@Field(index = FieldIndex.analyzed, analyzer = "ik", store = true, searchAnalyzer = "ik", type = FieldType.String)private String title;@Field(index = FieldIndex.analyzed, analyzer = "ik", store = true, searchAnalyzer = "ik", type = FieldType.String)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;}@Overridepublic String toString() {return "Article [id=" + id + ", title=" + title + ", content="+ content + "]";}
}

3.spring配置文件配置ElasticSearch

<?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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/data/elasticsearchhttp://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd "><!-- 扫描DAO包 自动创建实现 --><elasticsearch:repositories base-package="cn.itcast.dao" /><!-- 扫描Service包 --><context:component-scan base-package="cn.itcast.service" /><!-- 配置elasticsearch 连接 --><elasticsearch:transport-client id="client" cluster-nodes="localhost:9300" /><!-- spring data elasticsearch DAO 必须依赖 elasticsearchTemplate  --><bean id="elasticsearchTemplate" class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"><constructor-arg name="client" ref="client" /></bean></beans>

4.编写dao的spring-data elasticsearch接口

import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;import cn.itcast.domain.Article;public interface ArticleRepository extendsElasticsearchRepository<Article, Integer> {List<Article> findByTitle(String title);Page<Article> findByTitle(String title, Pageable pageable);}

5.常见错误分析

错误一 :

 java.lang.NoClassDefFoundError:org/springframework/core/ResolvableTypeProvider 

错误原因: 导报冲突
解决: spring 导包版本要一致,提升 spring 依赖版本 4.1.7 提升 4.2.8 (最高)
错误二:

MapperParsingException[No type specified for field [title]]

错误三:

Caused by: java.lang.AbstractMethodError: org.springframework.data.jpa.repos

原因:是spring-data-jpa.jar的版本和spring-data-commons-core.jar的版本不匹配所造成的,spring-data-commons-core.jar的版本过高了.
在发生异常的时候我的版本是:spring-data-jpa-1.0.2.RELEASE.jar和spring-data-commons-core-1.3.0.M1.jar
更改后:spring-data-jpa-1.0.2.RELEASE.jar和spring-data-commons-core-1.1.0.RELEASE.jar (OK)
错误原因: 实体类中未指定域的类型
解决: 在是类的字段中添加注解@Field(type = FieldType.String)
问题四:
ElasticSearch使用的是jackson来进行对象序列化的,所以有些时候可能会造成双向关联的对象,在转json的时候,会相互引用,造成栈内存溢出,需要使用@JsonIgnore来排除双向引用的字段

6.原始Elasticsearch用法

import java.io.IOException;
import java.net.InetAddress;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.Requests;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.highlight.HighlightField;
import org.junit.Test;import cn.itcast.elasticsearch.domain.Article;import com.fasterxml.jackson.databind.ObjectMapper;// ElasticSearch 测试程序
public class ElasticSearchTest {@Test// 直接在ElasticSearch中建立文档,自动创建索引public void demo1() throws IOException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 描述json 数据/** {id:xxx, title:xxx, content:xxx}*/XContentBuilder builder = XContentFactory.jsonBuilder().startObject().field("id", 1).field("title", "ElasticSearch是一个基于Lucene的搜索服务器").field("content","它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。").endObject();// 建立文档对象client.prepareIndex("blog1", "article", "1").setSource(builder).get();// 关闭连接client.close();}@Test// 搜索在elasticSearch中创建文档对象public void demo2() throws IOException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 搜索数据// get() === execute().actionGet()SearchResponse searchResponse = client.prepareSearch("blog1").setTypes("article").setQuery(QueryBuilders.matchAllQuery()).get();printSearchResponse(searchResponse);// 关闭连接client.close();}@Test// 各种查询使用public void demo3() throws IOException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 搜索数据// get() === execute().actionGet()// SearchResponse searchResponse = client.prepareSearch("blog1")// .setTypes("article")// .setQuery(QueryBuilders.queryStringQuery("全面")).get();// SearchResponse searchResponse = client.prepareSearch("blog1")// .setTypes("article")// .setQuery(QueryBuilders.wildcardQuery("content", "*全文*")).get();SearchResponse searchResponse = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("content", "搜索")).get();printSearchResponse(searchResponse);// 关闭连接client.close();}private void printSearchResponse(SearchResponse searchResponse) {SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象System.out.println("查询结果有:" + hits.getTotalHits() + "条");Iterator<SearchHit> iterator = hits.iterator();while (iterator.hasNext()) {SearchHit searchHit = iterator.next(); // 每个查询对象System.out.println(searchHit.getSourceAsString()); // 获取字符串格式打印System.out.println("title:" + searchHit.getSource().get("title"));}}@Test// 索引操作public void demo4() throws IOException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 创建索引client.admin().indices().prepareCreate("blog2").get();// 删除索引client.admin().indices().prepareDelete("blog2").get();// 关闭连接client.close();}@Test// 映射操作public void demo5() throws IOException, InterruptedException,ExecutionException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 添加映射XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("article").startObject("properties").startObject("id").field("type", "integer").field("store", "yes").endObject().startObject("title").field("type", "string").field("store", "yes").field("analyzer", "ik").endObject().startObject("content").field("type", "string").field("store", "yes").field("analyzer", "ik").endObject().endObject().endObject().endObject();PutMappingRequest mapping = Requests.putMappingRequest("blog2").type("article").source(builder);client.admin().indices().putMapping(mapping).get();// 关闭连接client.close();}@Test// 文档相关操作public void demo6() throws IOException, InterruptedException,ExecutionException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 描述json 数据/** {id:xxx, title:xxx, content:xxx}*/Article article = new Article();article.setId(2);article.setTitle("搜索工作其实很快乐");article.setContent("我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。");ObjectMapper objectMapper = new ObjectMapper();// 建立文档// client.prepareIndex("blog2", "article", article.getId().toString())// .setSource(objectMapper.writeValueAsString(article)).get();// 修改文档// client.prepareUpdate("blog2", "article", article.getId().toString())// .setDoc(objectMapper.writeValueAsString(article)).get();// 修改文档// client.update(// new UpdateRequest("blog2", "article", article.getId()// .toString()).doc(objectMapper// .writeValueAsString(article))).get();// 删除文档// client.prepareDelete("blog2", "article", article.getId().toString())// .get();// 删除文档client.delete(new DeleteRequest("blog2", "article", article.getId().toString())).get();// 关闭连接client.close();}@Test// 批量查询100条记录public void demo7() throws IOException, InterruptedException,ExecutionException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));ObjectMapper objectMapper = new ObjectMapper();for (int i = 1; i <= 100; i++) {// 描述json 数据Article article = new Article();article.setId(i);article.setTitle(i + "搜索工作其实很快乐");article.setContent(i+ "我们希望我们的搜索解决方案要快,我们希望有一个零配置和一个完全免费的搜索模式,我们希望能够简单地使用JSON通过HTTP的索引数据,我们希望我们的搜索服务器始终可用,我们希望能够一台开始并扩展到数百,我们要实时搜索,我们要简单的多租户,我们希望建立一个云的解决方案。Elasticsearch旨在解决所有这些问题和更多的问题。");// 建立文档client.prepareIndex("blog2", "article", article.getId().toString()).setSource(objectMapper.writeValueAsString(article)).get();}// 关闭连接client.close();}@Test// 分页搜索public void demo8() throws IOException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));// 搜索数据// get() === execute().actionGet()SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.matchAllQuery());// 查询第2页数据,每页20条searchRequestBuilder.setFrom(20).setSize(20);SearchResponse searchResponse = searchRequestBuilder.get();printSearchResponse(searchResponse);// 关闭连接client.close();}@Test// 高亮查询结果 处理 搜索public void demo9() throws IOException {// 创建连接搜索服务器对象Client client = TransportClient.builder().build().addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));ObjectMapper objectMapper = new ObjectMapper();// 搜索数据SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2").setTypes("article").setQuery(QueryBuilders.termQuery("title", "搜索"));// 高亮定义searchRequestBuilder.addHighlightedField("title"); // 对title字段进行高亮searchRequestBuilder.setHighlighterPreTags("<em>"); // 前置元素searchRequestBuilder.setHighlighterPostTags("</em>");// 后置元素SearchResponse searchResponse = searchRequestBuilder.get();SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象System.out.println("查询结果有:" + hits.getTotalHits() + "条");Iterator<SearchHit> iterator = hits.iterator();while (iterator.hasNext()) {SearchHit searchHit = iterator.next(); // 每个查询对象// 将高亮处理后内容,替换原有内容 (原有内容,可能会出现显示不全 )Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();HighlightField titleField = highlightFields.get("title");// 获取到原有内容中 每个高亮显示 集中位置 fragment 就是高亮片段Text[] fragments = titleField.fragments();String title = "";for (Text text : fragments) {title += text;}// 将查询结果转换为对象Article article = objectMapper.readValue(searchHit.getSourceAsString(), Article.class);// 用高亮后内容,替换原有内容article.setTitle(title);System.out.println(article);}// 关闭连接client.close();}
}

7.使用Spring data ElasticSearch来操作索引库

(1)扫描jpa包
<?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/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 扫描DAO包 自动创建实现 -->   <elasticsearch:repositories base-package="cn.itcast.bos.index" /><!-- 配置elasticsearch 连接 -->      <elasticsearch:transport-client id="client"cluster-nodes="localhost:9300" /> <!-- spring data elasticsearch DAO 必须依赖 elasticsearchTemplate --><bean id="elasticsearchTemplate"class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate"><constructor-arg name="client" ref="client" /> </bean>  </beans>
(2)继承Repository接口
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import cn.itcast.bos.domain.delivery.WayBill;public interface WayBillIndexRepository extends ElasticsearchRepository<WayBill, Integer> {}
测试(添加)
// 执行保存索引库
wayBillIndexRepository.save(entity);
测试(条件分页查询)
/*** 分页查询索引库*/@Overridepublic void findPage(WayBill wayBill, PageBean pageBean) {BoolQueryBuilder query = new BoolQueryBuilder();if (StringUtils.isNotBlank(wayBill.getWayBillNum())) {// 设置运单号条件QueryBuilder termQuery = new TermQueryBuilder("wayBillNum", wayBill.getWayBillNum());query.must(termQuery);}if (StringUtils.isNotBlank(wayBill.getSendAddress())) {// 设置发送地址条件BoolQueryBuilder boolQuery = new BoolQueryBuilder();QueryBuilder wildcardQuery = new WildcardQueryBuilder("sendAddress", "*" + wayBill.getSendAddress() + "*");QueryBuilder queryStringQuery = new QueryStringQueryBuilder(wayBill.getSendAddress()).field("sendAddress").defaultOperator(Operator.AND);boolQuery.should(wildcardQuery);boolQuery.should(queryStringQuery);query.must(boolQuery);}if (StringUtils.isNotBlank(wayBill.getRecAddress())) {// 设置接收地址条件BoolQueryBuilder boolQuery = new BoolQueryBuilder();QueryBuilder wildcardQuery = new WildcardQueryBuilder("recAddress", "*" + wayBill.getRecAddress() + "*");QueryBuilder queryStringQuery = new QueryStringQueryBuilder(wayBill.getRecAddress()).field("recAddress").defaultOperator(Operator.AND);boolQuery.should(wildcardQuery);boolQuery.should(queryStringQuery);query.must(boolQuery);}if (StringUtils.isNotBlank(wayBill.getSendProNum())) {// 设置产品类型条件QueryBuilder termQuery = new TermQueryBuilder("sendProNum", wayBill.getSendProNum());query.must(termQuery);}if (wayBill.getSignStatus() != null && wayBill.getSignStatus() != 0) {// 设置快递产品类型编号条件QueryBuilder termQuery = new TermQueryBuilder("signStatus", wayBill.getSignStatus());query.must(termQuery);}Page<WayBill> search = wayBillIndexRepository.search(query,new PageRequest(pageBean.getCurrentPage() - 1, pageBean.getPageSize()));pageBean.setRows(search.getContent());pageBean.setTotal(search.getTotalElements());}

Spring-data ElasticSearch的使用相关推荐

  1. Spring data elasticsearch的使用

    Spring data elasticsearch的使用 ArticleService package cn.zxl.service;import java.util.List;import org. ...

  2. Spring Data ElasticSearch入门案例

    Spring Data ElasticSearch入门案例 创建maven工程elasticsearch_springdata 基于maven导入坐标 导入spring data elasticsea ...

  3. spring data elasticsearch 对应 elasticsearch 版本

    spring data elasticsearch elasticsearch 3.2.x 6.5.0 3.1.x 6.2.2 3.0.x 5.5.0 2.1.x 2.4.0 2.0.x 2.2.0 ...

  4. Spring Data Elasticsearch案例详解

    一.Elasticsearch 工作原理 1.1 文档存储的路由 当索引到一个文档(如:报价系统),具体的文档数据(如:报价数据)会存储到一个分片.具体文档数据会被切分,并分别存储在分片 1 或者 分 ...

  5. Spring Boot + Spring Data + Elasticsearch实例

    在本文中,我们将讨论"如何创建Spring Boot + Spring Data + Elasticsearch范例". 本文中使用的工具: Spring Boot 1.5.1.R ...

  6. Elasticsearch 实战1:ES 项目实战(一)Java 集成 Spring Data Elasticsearch(一):简介及环境搭建

    一:前语 1.项目文档 CSDN 专栏:<Elasticsearch 入门和项目实战> 博客路径: https://blog.csdn.net/a767815662/category_91 ...

  7. 【Spring Data ElasticSearch】高级查询,聚合

    [Spring Data ElasticSearch]高级查询,聚合 1. 高级查询 1.1 基本查询 1.2 自定义查询 1.3 分页查询 1.4 排序 2. 聚合 2.1 聚合为桶 2.2 嵌套聚 ...

  8. Spring系列学习之Spring Data Elasticsearch数据访问

    英文原文:https://spring.io/projects/spring-data-elasticsearch 目录 概述 特性 快速开始 学习 文档 概述 Elasticsearch的Sprin ...

  9. Spring Data Elasticsearch 和 x-pack 用户名/密码验证连接

    为什么80%的码农都做不了架构师?>>>    使用Spring Data Elasticsearch连接elasticsearch时,正常情况下只需要在application.pr ...

  10. Lucene 和 Kibana、ElasticSeach、Spring Data ElasticSearch

    什么是全文检索 数据分类 生活中的数据总体分为两种:结构化数据和非结构化数据. 结构化数据 - 行数据,可以用二维表结构来逻辑表达实现的数据:指具有固定格式或有限长度的数据,如数据库,元数据等. 非结 ...

最新文章

  1. 2 自己编写:AppDelegate,CCApplication,CCApplicationProtocol
  2. Spring Data JPA 条件查询的关键字
  3. oracle备份归档文件,oracle 如何不备份已经备份的归档
  4. python 抠图 锯齿_Python | 绘图中的抗锯齿
  5. Linux安全手册(转载)
  6. 框架源码专题:Spring声明式事务Transactional的原理
  7. CentOS 编译 Nginx 服务
  8. 阶段1 语言基础+高级_1-3-Java语言高级_09-基础加强_第3节 注解_18_注解_案例_简单的测试框架...
  9. 【数字信号调制】基于matlab多进制数字相位调制(4PSK)【含Matlab源码 1001期】
  10. 八皇后问题遗传算法c语言,用 遗传算法 解决八皇后问题
  11. 后台事务无权限执行凭证
  12. matlab互相关函数并画图,自相关函数和互相关函数的matlab计算和作图
  13. JS设计模式——责任链模式
  14. 数据过多 如何实现页面滚动
  15. java 文件服务器搭建_NFS文件共享服务器的搭建
  16. 万物皆可DAO?一文带你全方位解读DAO类型
  17. java 将多个文件打包成压缩包下载
  18. ubuntu提示根目录存储空间不足的解决办法
  19. Linux基础入门 -用户与文件操作
  20. 中国软件服务外包IT公司最新排名-IT外包最强前50名

热门文章

  1. SQL Server 2016下载及安装教程
  2. 郭天祥《新概念51单片机C语言教程》序言
  3. SAP UI5 SmartForm 智能表单控件的使用方法介绍试读版
  4. python画图时常用的颜色——color=‘ ’
  5. csgo手机上看demo_《CSGO》观看游戏DEMO方法 怎么观看游戏DEMO
  6. windows下文件路径太深,删除解决方案
  7. 电机学(2) - 变压器
  8. 译者后记 ——《DOOM启示录》读后感(二)
  9. C++11 打印系统时间(精确到毫秒)和时间戳(毫秒单位)
  10. Windows 8 开发者预览版下载及简体中文语言包下载