博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ElasticSearch学习笔记:原生编程操作&高亮显示&Spring DataElasticSearch 入门和基础操作
阅读量:2056 次
发布时间:2019-04-28

本文共 32228 字,大约阅读时间需要 107 分钟。

第一章 ElasticSearch编程操作

1.1 创建工程,导入坐标

pom.xml坐标

org.elasticsearch
elasticsearch
5.6.8
org.elasticsearch.client
transport
5.6.8
org.apache.logging.log4j
log4j-to-slf4j
2.9.1
org.slf4j
slf4j-api
1.7.24
org.slf4j
slf4j-simple
1.7.21
log4j
log4j
1.2.12
junit
junit
4.12

1.2 创建索引index

@Test//创建索引public void test1() throws Exception{
// 创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //创建名称为blog2的索引 client.admin().indices().prepareCreate("blog2").get(); //释放资源 client.close();}

在这里插入图片描述

在这里插入图片描述

1.3 创建映射mapping

@Test//创建映射public void test3() throws Exception{
// 创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); // 添加映射 /** * 格式: * "mappings" : { "article" : { "dynamic" : "false", "properties" : { "id" : { "type" : "string" }, "content" : { "type" : "string" }, "author" : { "type" : "string" } } } } */ 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_smart") .endObject() .startObject("content") .field("type", "string").field("store", "yes").field("analyzer", "ik_smart") .endObject() .endObject() .endObject() .endObject(); // 创建映射 PutMappingRequest mapping = Requests.putMappingRequest("blog2") .type("article").source(builder); client.admin().indices().putMapping(mapping).get(); //释放资源 client.close();}

在这里插入图片描述

在这里插入图片描述

1.4 建立文档document

1.4.1 建立文档(通过XContentBuilder)

@Test//创建文档(通过XContentBuilder)public void test4() throws Exception{
// 创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //创建文档信息 XContentBuilder builder = XContentFactory.jsonBuilder() .startObject() .field("id", 1) .field("title", "ElasticSearch是一个基于Lucene的搜索服务器") .field("content", "它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。") .endObject(); // 建立文档对象 /** * 参数一blog1:表示索引对象 * 参数二article:类型 * 参数三1:建立id */ client.prepareIndex("blog2", "article", "1").setSource(builder).get(); //释放资源 client.close();}

在这里插入图片描述

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

  1. 创建Article实体
public class Article {
private Integer id; private String title; private String content; getter/setter...}
  1. 添加jackson坐标
com.fasterxml.jackson.core
jackson-core
2.8.1
com.fasterxml.jackson.core
jackson-databind
2.8.1
com.fasterxml.jackson.core
jackson-annotations
2.8.1
  1. 代码实现
@Test//创建文档(通过实体转json)public void test5() throws Exception{
// 创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .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(); .setSource(objectMapper.writeValueAsString(article).getBytes(), XContentType.JSON).get(); //释放资源 client.close();}

在这里插入图片描述

1.5 查询文档操作

1.5.1关键词查询

@Testpublic void testTermQuery() throws Exception{
//1、创建es客户端连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //2、设置搜索条件 SearchResponse searchResponse = client.prepareSearch("blog2") .setTypes("article") .setQuery(QueryBuilders.termQuery("content", "搜索")).get(); //3、遍历搜索结果数据 SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象 System.out.println("查询结果有:" + hits.getTotalHits() + "条"); Iterator
iterator = hits.iterator(); while (iterator.hasNext()) {
SearchHit searchHit = iterator.next(); // 每个查询对象 System.out.println(searchHit.getSourceAsString()); // 获取字符串格式打印 System.out.println("title:" + searchHit.getSource().get("title")); } //4、释放资源 client.close();}

2.5.2 字符串查询

@Testpublic void testStringQuery() throws Exception{
//1、创建es客户端连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); //2、设置搜索条件 SearchResponse searchResponse = client.prepareSearch("blog2") .setTypes("article") .setQuery(QueryBuilders.queryStringQuery("搜索")).get(); //3、遍历搜索结果数据 SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象 System.out.println("查询结果有:" + hits.getTotalHits() + "条"); Iterator
iterator = hits.iterator(); while (iterator.hasNext()) {
SearchHit searchHit = iterator.next(); // 每个查询对象 System.out.println(searchHit.getSourceAsString()); // 获取字符串格式打印 System.out.println("title:" + searchHit.getSource().get("title")); } //4、释放资源 client.close();}

2.5.2 使用文档ID查询文档

@Test    public void testIdQuery() throws Exception {
//client对象为TransportClient对象 SearchResponse response = client.prepareSearch("blog1") .setTypes("article") //设置要查询的id .setQuery(QueryBuilders.idsQuery().addIds("test002")) //执行查询 .get(); //取查询结果 SearchHits searchHits = response.getHits(); //取查询结果总记录数 System.out.println(searchHits.getTotalHits()); Iterator
hitIterator = searchHits.iterator(); while(hitIterator.hasNext()) {
SearchHit searchHit = hitIterator.next(); //打印整行数据 System.out.println(searchHit.getSourceAsString()); } }

2.6 查询文档分页操作

2.6.1 批量插入数据

@Test//批量插入100条数据public void test9() throws Exception{
// 创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .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(); .setSource(objectMapper.writeValueAsString(article).getBytes(),XContentType.JSON).get(); } //释放资源 client.close();}

在这里插入图片描述

2.6.2 分页查询

@Test//分页查询public void test10() throws Exception{
// 创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); // 搜索数据 SearchRequestBuilder searchRequestBuilder = client.prepareSearch("blog2").setTypes("article") .setQuery(QueryBuilders.matchAllQuery());//默认每页10条记录 // 查询第2页数据,每页20条 //setFrom():从第几条开始检索,默认是0。 //setSize():每页最多显示的记录数。 searchRequestBuilder.setFrom(0).setSize(5); SearchResponse searchResponse = searchRequestBuilder.get(); SearchHits hits = searchResponse.getHits(); // 获取命中次数,查询结果有多少对象 System.out.println("查询结果有:" + hits.getTotalHits() + "条"); Iterator
iterator = hits.iterator(); while (iterator.hasNext()) {
SearchHit searchHit = iterator.next(); // 每个查询对象 System.out.println(searchHit.getSourceAsString()); // 获取字符串格式打印 System.out.println("id:" + searchHit.getSource().get("id")); System.out.println("title:" + searchHit.getSource().get("title")); System.out.println("content:" + searchHit.getSource().get("content")); System.out.println("-----------------------------------------"); } //释放资源 client.close();}

在这里插入图片描述

2.7 查询结果高亮操作

2.7.1 什么是高亮显示

在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮

百度搜索关键字"魔鬼"

在这里插入图片描述

京东商城搜索"笔记本"

在这里插入图片描述

2.7.2 高亮显示的html分析

通过开发者工具查看高亮数据的html代码实现:

在这里插入图片描述

ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹

2.7.3 高亮显示代码实现

@Test//高亮查询public void test11() throws Exception{
// 创建Client连接对象 Settings settings = Settings.builder().put("cluster.name", "my-elasticsearch").build(); TransportClient client = new PreBuiltTransportClient(settings) .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300)); // 搜索数据 SearchRequestBuilder searchRequestBuilder = client .prepareSearch("blog2").setTypes("article") .setQuery(QueryBuilders.termQuery("title", "搜索")); //设置高亮数据 HighlightBuilder hiBuilder=new HighlightBuilder(); hiBuilder.preTags(""); hiBuilder.postTags(""); 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); } } //释放资源 client.close();}

在这里插入图片描述

第三章 Spring Data ElasticSearch 使用

3.1 Spring Data ElasticSearch简介

3.1.1 什么是Spring Data

Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得对数据的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。 Spring Data可以极大的简化JPA的写法,可以在几乎不用写实现的情况下,实现对数据的访问和操作。除了CRUD外,还包括如分页、排序等一些常用的功能。

Spring Data的官网:http://projects.spring.io/spring-data/

Spring Data常用的功能模块如下:

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

3.1.2 什么是Spring Data ElasticSearch

Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 。Spring Data为Elasticsearch项目提供集成搜索引擎。Spring Data Elasticsearch POJO的关键功能区域为中心的模型与Elastichsearch交互文档和轻松地编写一个存储库数据访问层。

官方网站:

3.2 Spring Data ElasticSearch入门

  1. 导入Spring Data ElasticSearch坐标
4.0.0
com.heiheihei
heiheihei_elasticsearch_demo3
1.0-SNAPSHOT
org.elasticsearch
elasticsearch
5.6.8
org.elasticsearch.client
transport
5.6.8
org.apache.logging.log4j
log4j-to-slf4j
2.9.1
org.slf4j
slf4j-api
1.7.24
org.slf4j
slf4j-simple
1.7.21
log4j
log4j
1.2.12
junit
junit
4.12
com.fasterxml.jackson.core
jackson-core
2.8.1
com.fasterxml.jackson.core
jackson-databind
2.8.1
com.fasterxml.jackson.core
jackson-annotations
2.8.1
org.springframework.data
spring-data-elasticsearch
3.0.5.RELEASE
org.elasticsearch.plugin
transport-netty4-client
org.springframework
spring-test
5.0.4.RELEASE
  1. 创建applicationContext.xml配置文件,引入elasticsearch命名空间
  1. 编写实体Article
package com.heiheihei.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 + "]"; }}
  1. 编写Dao
package com.heiheihei.dao;import com.heiheihei.domain.Article;import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;@Repositorypublic interface ArticleRepository extends ElasticsearchRepository
{
}
  1. 编写Service
package com.heiheihei.service;import com.heiheihei.domain.Article;public interface ArticleService {
public void save(Article article); }
package com.heiheihei.service.impl;import com.heiheihei.dao.ArticleRepository;import com.heiheihei.domain.Article;import com.heiheihei.service.ArticleService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;@Servicepublic class ArticleServiceImpl implements ArticleService {
@Autowired private ArticleRepository articleRepository; public void save(Article article) {
articleRepository.save(article); }}
  1. 配置applicationContext.xml
  1. 配置实体

基于spring data elasticsearch注解配置索引、映射和实体的关系

package com.heiheihei.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 + "]"; }}

其中,注解解释如下:

@Document(indexName="blob3",type="article"):    indexName:索引的名称(必填项)    type:索引的类型@Id:主键的唯一标识@Field(index=true,analyzer="ik_smart",store=true,searchAnalyzer="ik_smart",type = FieldType.text)    index:是否设置分词    analyzer:存储时使用的分词器    searchAnalyze:搜索时使用的分词器    store:是否存储    type: 数据类型
  1. 创建测试类SpringDataESTest
package com.heiheihei.test;import com.heiheihei.domain.Article;import com.heiheihei.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 进行封装 \n" + " Spring Data为Elasticsearch Elasticsearch项目提供集成搜索引擎"); articleService.save(article); }}

3.3 Spring Data ElasticSearch的常用操作

3.3.1 增删改查方法测试

package com.heiheihei.service;import com.heiheihei.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
findAll(); //分页查询 public Page
findAll(Pageable pageable);}
package com.heiheihei.service.impl;import com.heiheihei.dao.ArticleRepository;import com.heiheihei.domain.Article;import com.heiheihei.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;@Servicepublic 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
findAll() {
Iterable
iter = articleRepository.findAll(); return iter; } public Page
findAll(Pageable pageable) {
return articleRepository.findAll(pageable); }}
package com.heiheihei.test;import com.heiheihei.domain.Article;import com.heiheihei.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("测试SpringData ElasticSearch"); article.setContent("Spring Data ElasticSearch 基于 spring data API 简化 elasticSearch操作,将原始操作elasticSearch的客户端API 进行封装 \n" + " Spring Data为Elasticsearch Elasticsearch项目提供集成搜索引擎"); articleService.save(article); } /**测试保存*/ @Test public void save(){
Article article = new Article(); article.setId(1001); article.setTitle("elasticSearch 3.0版本发布"); article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口"); articleService.save(article); } /**测试更新*/ @Test public void update(){
Article article = new Article(); article.setId(1001); article.setTitle("elasticSearch 3.0版本发布...更新"); article.setContent("ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口"); 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
page = articleService.findAll(pageable); for(Article article:page.getContent()){
System.out.println(article); } }}

3.3.2 常用查询命名规则(自定义)

关键字 命名规则 解释 示例
and findByField1AndField2 根据Field1和Field2获得数据 findByTitleAndContent
or findByField1OrField2 根据Field1或Field2获得数据 findByTitleOrContent
is findByField 根据Field获得数据 findByTitle
not findByFieldNot 根据Field获得补集数据 findByTitleNot
between findByFieldBetween 获得指定范围的数据 findByPriceBetween
lessThanEqual findByFieldLessThan 获得小于等于指定值的数据 findByPriceLessThan

3.3.3 查询方法测试(自定义)

1)dao层实现

package com.heiheihei.dao;import com.heiheihei.domain.Article;import org.springframework.data.domain.Page;import org.springframework.data.domain.Pageable;import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;import java.util.List;public interface ArticleRepository extends ElasticsearchRepository
{
//根据标题查询 List
findByTitle(String condition); //根据标题查询(含分页) Page
findByTitle(String condition, Pageable pageable);}

2)service层实现

public interface ArticleService {
//根据标题查询 List
findByTitle(String condition); //根据标题查询(含分页) Page
findByTitle(String condition, Pageable pageable);}
package com.heiheihei.service.impl;import com.heiheihei.dao.ArticleRepository;import com.heiheihei.domain.Article;import com.heiheihei.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;import java.util.List;@Servicepublic class ArticleServiceImpl implements ArticleService {
@Autowired private ArticleRepository articleRepository; public List
findByTitle(String condition) {
return articleRepository.findByTitle(condition); } public Page
findByTitle(String condition, Pageable pageable) {
return articleRepository.findByTitle(condition,pageable); }}

3)测试代码

package com.heiheihei.test;import com.heiheihei.domain.Article;import com.heiheihei.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;import java.util.List;@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 findByTitle(){
String condition = "版本"; List
articleList = articleService.findByTitle(condition); for(Article article:articleList){
System.out.println(article); } } /**条件分页查询*/ @Test public void findByTitlePage(){
String condition = "版本"; Pageable pageable = PageRequest.of(2,10); Page
page = articleService.findByTitle(condition,pageable); for(Article article:page.getContent()){
System.out.println(article); } }}

3.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)); }

补充测试

import com.heiheihei.es.entity.Article;import com.heiheihei.es.repositories.ArticleRepository;import org.elasticsearch.index.query.QueryBuilders;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.domain.PageRequest;import org.springframework.data.domain.Pageable;import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;import org.springframework.test.context.ContextConfiguration;import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import java.util.List;import java.util.Optional;/** * @author 嘿嘿嘿1212 * @version 1.0 * @date 2019/11/8 22:09 */@RunWith(SpringJUnit4ClassRunner.class)@ContextConfiguration("classpath:applicationContext.xml")public class SpringDataElasticSearchTest {
//实现了ElasticsearchRepository
@Autowired private ArticleRepository articleRepository; @Autowired private ElasticsearchTemplate elasticsearchTemplate; /** * 创建索引与映射关系 * @throws Exception */ @Test public void createIndex() throws Exception {
elasticsearchTemplate.createIndex(Article.class); } /** * 添加文档 * @throws Exception */ @Test public void addDocument() throws Exception {
for (int i = 1; i <= 10; i++) {
//创建一个Article对象 Article article = new Article(); article.setId(i); article.setTitle("版次: <01> 封面新闻 - 西安报业传媒集团 数字报刊 " + i); article.setContent("一位来自“世界高城”新闻通讯员的故事 " + i); //把文档写入是索引库 articleRepository.save(article); } } /** * 根据id删除文档 * @throws Exception */ @Test public void deleteDocumentById() throws Exception {
articleRepository.deleteById(1L); //全部删除// articleRepository.deleteAll(); } /** * 查询所有文档 * @throws Exception */ @Test public void findAll() throws Exception {
Iterable
articles = articleRepository.findAll(); articles.forEach(System.out::println); } /** * 根据id查询文档 * @throws Exception */ @Test public void testFindById() throws Exception {
Optional
optional = articleRepository.findById(1L); Article article = optional.get(); System.out.println(article); } /** * 自定义根据Title查询 * @throws Exception */ @Test public void testFindByFindByTitle() throws Exception {
List
list = articleRepository.findByTitle("5"); list.stream().forEach(System.out::println); } /** * 自定义根据Title与Content查询并分页 * @throws Exception */ @Test public void testFindByTitleOrContent() throws Exception {
Pageable pageable = PageRequest.of(0, 15); articleRepository.findByTitleOrContent("封面新闻", "世界高城", pageable) .forEach(System.out::println); } /** * 原生查询 * @throws Exception */ @Test public void testNativeSearchQuery() throws Exception {
NativeSearchQuery query = new NativeSearchQueryBuilder() .withQuery(QueryBuilders.queryStringQuery("封面新闻").defaultField("title")) .withPageable(PageRequest.of(0, 15)) //高亮显示类似 //.withHighlightFields(new HighlightBuilder.Field(searchField) //替换默认高亮标签
//.preTags("
").postTags("")); .build(); List
articleList = elasticsearchTemplate.queryForList(query, Article.class); articleList.forEach(System.out::println); }}

转载地址:http://tnilf.baihongyu.com/

你可能感兴趣的文章
行为型模式之状态模式(State)
查看>>
行为型模式之策略模式(Strategy)
查看>>
行为型模式之模板方法模式(TemplateMethod)
查看>>
行为型模式之访问者模式(Visitor)
查看>>
大小端详解
查看>>
source insight使用方法简介
查看>>
<stdarg.h>头文件的使用
查看>>
C++/C 宏定义(define)中# ## 的含义 宏拼接
查看>>
Git安装配置
查看>>
linux中fork()函数详解
查看>>
C语言字符、字符串操作偏僻函数总结
查看>>
Git的Patch功能
查看>>
分析C语言的声明
查看>>
TCP为什么是三次握手,为什么不是两次或者四次 && TCP四次挥手
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>