当前位置:   article > 正文

Spring整合ElasticSearch

spring整合elasticsearch

摘录自《Elasticsearch 权威指南(中文版)》
地址:https://es.xiaoleilu.com/index.html
目的:方便以后使用es
先介绍下ES一些基础概念,后面才是spring整合


ES集群:

在这里插入图片描述

ES为Java内置了两套客户端(通过9300端口通信)

在这里插入图片描述
在这里插入图片描述
ps:其他语言使用9200端口与ES通信

基础使用

设置分片(在添加索引时)

PUT /blogs
{
   "settings" : {
      "number_of_shards" : 3,    主分片数量,一旦设置不可变更
      "number_of_replicas" : 1   几份复制分片(1份即33副,2份即36副) 
   }
}
索引(index)仅是用来指向一个或多个分片的“逻辑命名空间(logical namespace)”
分片(shard)是最小的工作单元(worker unit),是实际存储数据的地方

动态设置复制分片
PUT /blogs/_settings
{
   "number_of_replicas" : 2
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

启动多个节点

1.同一台服务器(测试的时候使用)
/config/elasticsearch.yml中添加node.max_local_storage_nodes: 3
然后多次启动即可,es会自动将新节点加入集群
ps:同一台机器启动多个节点,实际上,硬件资源并没有增加,且服务器挂了以后,所有的分片都在同一服务器,也失去了集群的意义

2.不同服务器
/config/elasticsearch.yml使用相同的集群名称,即“cluster.name”的值一致
???ip设置???
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

文档(Document)

  1. ES作为一个分布式文档搜索引擎,每个字段都默认被索引
  2. ES文档不可修改,只能覆盖

映射及分析

重要参数

1.type(除了String类型,其他的很少做映射)

2.index

解释
analyzed首先分析这个字符串,然后索引。换言之,以全文形式索引此字段。
not_analyzed索引这个字段,使之可以被搜索,但是索引内容和指定值一样。不分析此字段。
no不索引这个字段。这个字段不能为搜索到。

结构化语句:

项目结构化查询(Query DSL)结构化过滤(Filter DSL)
目的询问每个文档目标字段的值与目标值的匹配程度如何检查是否包含特定值
适用范围全文本搜索,相关性评分剩下的所有
性能因为需要计算相关性,耗时,且不可缓存结果集是一个简单的文档列表,方便缓存
备注查询语句会计算每个文档与查询语句的相关性,最后给出一个综合评分_score,并按相关性进行排序不包含的直接过滤掉

结构化查询/_search,body需要传参query{…}

{
	"query":{
		"match_all":{}    匹配所有文档
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
query
	单条查询
	match
		{"tweet":"es"}  分析文档,分析查询字符,在tweet字段进行查询
	multi_match
		{
     	   "query":    "full text search",  分析文档,分析查询字符,在title和body字段进行查询
     	   "fields":   [ "title", "body" ]  并对结果做并集
  		}
	term
		{"age":26}  精确匹配,一般用于数字,日期,布尔值或"not_analyzed"的字符串(未经分析的字符串)
	terms
		{"date":["2014-09-18","2014-09-19"]}  精确匹配,日期是2014-09-182014-09-19的都找出来,然后做并集返回
	range
		{"age":{"gte":20,"lt":30}}  范围查找
	exists
		{"field":"email"}  对文档匹配,将包含email字段的文档选出
	missing(已废弃)
		{"field":"email"}  对文档匹配,将不包含email字段的文档选出
	bool must_not exists代替
	
	合并单条查询
	bool  用于合并多个子查询
		must		相当于and
		must_not 	相当于not
		should		相当于or
    "bool": {
        "must":     {"term":{"age":"26"}},  年纪必须是26"must_not": {"term":{"email":"abc@yahoo.com"}},  邮箱一定不能是abc@yahoo.com
        "should": [							
                    {"term":{"tweet":"es"}},
                    {"term":{"tweet":"se"}}
        ]  
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

_validate/query用于验证查询语句是否合法
_validate/query?explain可以查询错误信息

SpringBoot整合

依赖引入


<--核心依赖-->
<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>3.1.5.RELEASE</version>
    <exclusions>
        <exclusion>
            <artifactId>elasticsearch-cli</artifactId>
            <groupId>org.elasticsearch</groupId>
        </exclusion>
        <exclusion>
            <artifactId>elasticsearch-core</artifactId>
            <groupId>org.elasticsearch</groupId>
        </exclusion>
    </exclusions>
</dependency>

<--核心依赖中有两个依赖报是6.2.2版本的,一直报错,因此剔除,并自己导入-->
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch-core</artifactId>
    <version>6.2.4</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch-cli</artifactId>
    <version>6.2.4</version>
</dependency>

注意:
1.如果用最新的版本6.6.2,貌似有个类org.elasticsearch.common.logging.Loggers被移除了,会一直报错
2.我客户端是6.6.2版本的,此处导入6.2.4版本的依赖,也能正常访问
3.英文官方文档说TransportClient即将在7x版本被标记为过时,并在8x版本进行移除,然后用 Java High Level REST Client进行替代
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

创建实体类

indexName索引名称,type类型名称,
shards主分片数量(默认5),replicas复制分片份数 (默认1@Document(indexName = "people",type = "teacher",shards = 2,replicas = 1)
public class Teacher {
    @Id  标记为主键,不可少
    private Integer id;
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

dao层创建,之后由spring自动生成访问es的代理对象

泛型第一个类型参数是封装数据的实体类,第二个类型参数是该实体类的主键类型(即标记了@Id的实例域的类型)
public interface TeacherReposotory extends ElasticsearchRepository<Teacher,Integer>{
}
  • 1
  • 2
  • 3

业务使用

@Autowired
TeacherReposotory teacherReposotory;  完成注入

public void search() {
	创建查询对象(此处以布尔查询为例)
    BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
    创建match查询对象(同理可用QueryBuilders.termQuery()创建term过滤对象)  
    MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("name", "小明");  
    确定该查询是and\not\or
    boolQueryBuilder.must(matchQueryBuilder);
    获取返回数据,是个迭代器
    Iterable<Teacher> Iterable = esTeacherReposotory.search(boolQueryBuilder);
    Iterator<Teacher> iterator = Iterable.iterator();
    数据输出
    while (iterator.hasNext()){
        Teacher teacher = iterator.next();
        System.out.println(teacher.toString());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

注意:
1.启动时可能报mvc相关的错误,springboot的配置文件中把<mvc:annotation-driven/>注释掉即可
2.<mvc:annotation-driven/>注释后自定义的事务管理器可能没办法用
3.因为elasticsearch在使用时,最经常报的就是版本上的jar包冲突,所以建议另起一个工程,提供查询接口

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/609109
推荐阅读
相关标签
  

闽ICP备14008679号