赞
踩
摘录自《Elasticsearch 权威指南(中文版)》
地址:https://es.xiaoleilu.com/index.html
目的:方便以后使用es
先介绍下ES一些基础概念,后面才是spring整合
ps:其他语言使用9200端口与ES通信
设置分片(在添加索引时)
PUT /blogs
{
"settings" : {
"number_of_shards" : 3, 主分片数量,一旦设置不可变更
"number_of_replicas" : 1 几份复制分片(1份即3主3副,2份即3主6副)
}
}
索引(index)仅是用来指向一个或多个分片的“逻辑命名空间(logical namespace)”
分片(shard)是最小的工作单元(worker unit),是实际存储数据的地方
动态设置复制分片
PUT /blogs/_settings
{
"number_of_replicas" : 2
}
启动多个节点
1.同一台服务器(测试的时候使用)
/config/elasticsearch.yml中添加node.max_local_storage_nodes: 3
然后多次启动即可,es会自动将新节点加入集群
ps:同一台机器启动多个节点,实际上,硬件资源并没有增加,且服务器挂了以后,所有的分片都在同一服务器,也失去了集群的意义
2.不同服务器
/config/elasticsearch.yml使用相同的集群名称,即“cluster.name”的值一致
???ip设置???
重要参数
1.type(除了String类型,其他的很少做映射)
2.index
值 | 解释 |
---|---|
analyzed | 首先分析这个字符串,然后索引。换言之,以全文形式索引此字段。 |
not_analyzed | 索引这个字段,使之可以被搜索,但是索引内容和指定值一样。不分析此字段。 |
no | 不索引这个字段。这个字段不能为搜索到。 |
项目 | 结构化查询(Query DSL) | 结构化过滤(Filter DSL) |
---|---|---|
目的 | 询问每个文档目标字段的值与目标值的匹配程度如何 | 检查是否包含特定值 |
适用范围 | 全文本搜索,相关性评分 | 剩下的所有 |
性能 | 因为需要计算相关性,耗时,且不可缓存 | 结果集是一个简单的文档列表,方便缓存 |
备注 | 查询语句会计算每个文档与查询语句的相关性,最后给出一个综合评分_score,并按相关性进行排序 | 不包含的直接过滤掉 |
结构化查询/_search,body需要传参query{…}
{
"query":{
"match_all":{} 匹配所有文档
}
}
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-18和2014-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"}} ] }
_validate/query用于验证查询语句是否合法
_validate/query?explain可以查询错误信息
依赖引入
<--核心依赖--> <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进行替代
创建实体类
indexName索引名称,type类型名称,
shards主分片数量(默认5),replicas复制分片份数 (默认1)
@Document(indexName = "people",type = "teacher",shards = 2,replicas = 1)
public class Teacher {
@Id 标记为主键,不可少
private Integer id;
...
}
dao层创建,之后由spring自动生成访问es的代理对象
泛型第一个类型参数是封装数据的实体类,第二个类型参数是该实体类的主键类型(即标记了@Id的实例域的类型)
public interface TeacherReposotory extends ElasticsearchRepository<Teacher,Integer>{
}
业务使用
@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.启动时可能报mvc相关的错误,springboot的配置文件中把<mvc:annotation-driven/>注释掉即可
2.<mvc:annotation-driven/>注释后自定义的事务管理器可能没办法用
3.因为elasticsearch在使用时,最经常报的就是版本上的jar包冲突,所以建议另起一个工程,提供查询接口
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。