很久之前就安装了elasticsearch,一直没用java用过,最近看了一下spring data系列的elasticsearch,这里写一篇心得。

如果尚未安装elasticsearch,可以 参考https://www.cnblogs.com/shaozm/p/8732842.html这篇文章。

一 、原生写法

连接客户端

先谈谈原生的写法,

 private TransportClient client;
public TransportClient getClient(){
Settings setting = Settings.builder()
.put("cluster.name", "elas_cluster")
.put("client.transport.ignore_cluster_name", true)
// .put("client.transport.nodes_sampler_interval", 5) //
.put("client.transport.sniff", true)
.build(); client = new PreBuiltTransportClient(setting)
.addTransportAddress(
new TransportAddress(new InetSocketAddress("192.168.0.2",9300))
);
return client; }

首先连接客户端,这里单节点和集群写法一致,如果是集群的话也只需配置master节点,官方说法是客户端开启嗅探之后,会把嗅探到的节点列表把本地覆盖掉。

搜索

因为我是用spring data elasticsearch框架导入的数据,所以这里就不写index, type的创建,就展示一下搜索的写法。 

 public  void  search(){

        QueryBuilder queryBuilder= QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("newsTitle","首个电商俱乐部"))
.must(QueryBuilders.matchQuery("newsCate","科技")); SearchResponse response= client.prepareSearch("test")
.setTypes("newsArticle")
.setQuery(queryBuilder).get();
SearchHits searchHits = response.getHits();
for(SearchHit searchHit : searchHits) {
System.out.println(searchHit);
} client.close();
}

基本搜索解析

这里先谈一下基本的搜索

elasticsearch 搜索请求是restful风格的,它的搜索请求都是根据 json格式的参数去搜索的。

一般来说 elasticsearch 的普通搜索json都是类似  { "query" :  ... }     这样的,

首先elasticsearch 的所有搜索基本分成两种,一个是 过滤 ,一种是查询 (为了区分我这里称得分搜索) ,它们区别举例说明

像过滤搜索判断都是直接判断符不符合,比如是不是这个年龄范围的,这个字段是不是匹配的,是就返回,不是就不返回,

而得分搜索有一个score分数作为返回依据,比如这个字段匹配的,给你一点分数,那个字段没匹配,没分数,综合所有的分数看是不是达标了,达标了返回,不达标不返回。

类似

{ "query" : {“range” : { ....... }} }

{ "query" : {“term” : { ....... }} }     term是精确查询,需要完全匹配

属于过滤搜索

{ "query" : {“match” : { ....... }} }

{ "query" : {“bool” : { ....... }} }

属于得分搜索

而像{ "query" : {“bool” : { ....... }} } 这种是组合多个查询的,其中........ 的内容可以是多个must 或者should或者must_not或者filter的组合,最终计算score

二、spring data elasticsearch

准备工作

现在可以进入主题了,spring data elasticsearch的用法

先导包

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

接着配置yml

spring:
data:
elasticsearch:
repositories:
enabled: true
cluster-nodes: 192.168.0.2:9300
cluster-name: elas_cluster

异常

这里说一个bug,如果有redis你可能会抛异常,我这里是在启动类里配置了这么一行

public static void main(String[] args) throws Exception{
System.setProperty("es.set.netty.runtime.available.processors", "false");
SpringApplication.run(EsStart.class,args);
}

使用详解

spring-data系列的框架,用过jpa的应该都知道套路

首先配置实体注解

@Document(indexName = "test",type = "newsArticle")
public class NewsArticlePO {
......
}
如果有什么字段需要分词器,可以单独在字段上配置
。。。。。。
@Field(type = FieldType.Text, analyzer = "ik_max_word",searchAnalyzer = "ik_max_word")
private String newsTitle;
。。。。。。

这时候一启动项目就会发现index,type已经自动生成了

第二步

创建repository
public interface ArticleRepository extends ElasticsearchRepository<NewsArticlePO,Long> {
。。。。。。
}
这里有几种做法,一个是自己利用名字规则定义新的方法,一个是用query注解创建查询,一个是使用父类继承的方法。

第一种方法

在 ArticleRepository中创建方法 
/**
* 根据标题,类别两个字段搜索
* */
List<NewsArticlePO> findByNewsTitleAndAndNewsCate(String newsTitle,String newsCate);
具体规则参考spring data elasticsearch的官方文档附录

第二种方法
在 ArticleRepository中创建方法 
@Query("{\"bool\": {\"must\": [{ \"match\": { \"newsTitle\": \"?0\"}},{ \"match\": { \"newsCate\": \"?1\"}}]}}")
List<NewsArticlePO> findByQuery(String newsTitle, String newsCate);

第三种方法
在service层代码或者其他类中注入 ArticleRepository
@Resource
private ArticleRepository articleRepository;

创建方法
public Page<NewsArticlePO> searchBuild(String newsTitle, String newsCate) {

    QueryBuilder queryBuilder= QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("newsTitle",newsTitle))
.must(QueryBuilders.matchQuery("newsCate",newsCate)); SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.build();
return articleRepository.search(searchQuery);
}


这就ok了,如果不喜欢使用repository也没事,可以注入ElasticsearchTemplate 
@Resource
private ElasticsearchTemplate elasticsearchTemplate;
public List<NewsArticlePO> searchTemplate(String newsTitle, String newsCate){
QueryBuilder queryBuilder= QueryBuilders.boolQuery()
.must(QueryBuilders.matchQuery("newsTitle",newsTitle))
.must(QueryBuilders.matchQuery("newsCate",newsCate)); SearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(queryBuilder)
.build();
return elasticsearchTemplate.queryForList(searchQuery,NewsArticlePO.class);
}

甚至可以通过elasticsearchTemplate.getClient()得到原生的client进行操作
demo项目地址 https://github.com/1160809039/elasticsearch-demo

spring data elasticsearch 使用的更多相关文章

  1. elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    一.ES Client 简介 1. ES是一个服务,采用C/S结构 2. 回顾 ES的架构 3. ES支持的客户端连接方式 3.1 REST API ,端口 9200 这种连接方式对应于架构图中的RE ...

  2. Elasticsearch基本用法(2)--Spring Data Elasticsearch

    Spring Data Elasticsearch是Spring Data项目下的一个子模块. 查看 Spring Data的官网:http://projects.spring.io/spring-d ...

  3. Elasticsearch Java client(ES Client 简介、Java REST Client、Java Client、Spring Data Elasticsearch)

    elasticsearch系列七:ES Java客户端-Elasticsearch Java client(ES Client 简介.Java REST Client.Java Client.Spri ...

  4. Spring Boot + Spring Data + Elasticsearch实例

    Spring Boot + Spring Data + Elasticsearch实例 学习了:https://blog.csdn.net/huangshulang1234/article/detai ...

  5. elasticsearch 拼音+ik分词,spring data elasticsearch 拼音分词

    elasticsearch 自定义分词器 安装拼音分词器.ik分词器 拼音分词器: https://github.com/medcl/elasticsearch-analysis-pinyin/rel ...

  6. How to provide highlighting with Spring data elasticsearch

    How to provide highlighting with Spring data elasticsearch @Test public void shouldReturnHighlighted ...

  7. springboot集成spring data ElasticSearch

    ES支持SpringBoot使用类似于Spring Data Jpa的方式查询,使得查询更加方便. 1.依赖引入 compile “org.springframework.boot:spring-bo ...

  8. 031 Spring Data Elasticsearch学习笔记---重点掌握第5节高级查询和第6节聚合部分

    Elasticsearch提供的Java客户端有一些不太方便的地方: 很多地方需要拼接Json字符串,在java中拼接字符串有多恐怖你应该懂的 需要自己把对象序列化为json存储 查询到结果也需要自己 ...

  9. SpringBoot整合Spring Data Elasticsearch

    Spring Data Elasticsearch提供了ElasticsearchTemplate工具类,实现了POJO与elasticsearch文档之间的映射 elasticsearch本质也是存 ...

随机推荐

  1. C#写入文本文档

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. HTML IMG标签SRC为null

    今天做项目遇到一个错 研究了半天才发现 其实就是一个小错 稍微注意一下 就能规避 HTML标签<img src="null">这种情况下在chrom的debug下就会报 ...

  3. 类库文件引用web服务报错解决方法-在 ServiceModel 客户端配置部分中,找不到引用协定的默认终结点元素

    由于需求,需要改造原有应用,因原有应用是写在console下面的,现在需要开放至web下, 想到BIZ层应用代码都是一样的,又不想在web下在添加引用,而重复写代码,故将原有的console下的服务和 ...

  4. Python错误和异常概念(总)

    转载请标明出处: http://www.cnblogs.com/why168888/p/6435956.html 本文出自:[Edwin博客园] Python错误和异常概念(总) 1. 错误和异常的处 ...

  5. N个苹果分给M个人,有多少种分法

    每次分配一个苹果出去,然后再分配N-1个苹果.这里有个注意的地方就是,分那1个苹果的时候,假设还有N个苹果,不是从第一个人开始分,而是从N+1个苹果分配的位置开始,不然的话会产生重复的解.所以i=p不 ...

  6. UVA 10288 Coupons---概率 && 分数类模板

    题目链接: https://cn.vjudge.net/problem/UVA-10288 题目大意: 一种刮刮卡一共有n种图案,每张可刮出一个图案,收集n种就有奖,问平均情况下买多少张才能中奖?用最 ...

  7. CF 553E Kyoya and Train

    题目分析 期望\(\text{dp}\). 设\(f_{i,j}\)表示在第\(j\)个时刻从\(i\)点出发,到达终点的期望花费. 有转移方程: \[ f_{x,t}=\min_{(x,y)\in ...

  8. CSS样式命名规则

    1.样式命名外 套: wrap主导航: mainnav子导航: subnav页 脚: footer整个页面: content页 眉: header页 脚: footer商 标: label标 题: t ...

  9. programming-languages学习笔记--第7部分

    programming-languages学习笔记–第7部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src ...

  10. PAT——1041. 考试座位号

    每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位.正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统会显示该考生的考试座位号码,考试时考生需要换到考试座 ...