springboot集成es配置突然操作es客户端,transportClient
es学习简介 : 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。
Elasticsearch官网:https://www.elastic.co/cn/products/elasticsearch
特点:
- 分布式,无需人工搭建集群(solr就需要人为配置,使用Zookeeper作为注册中心)
- Restful风格,一切API都遵循Rest原则,容易上手
- 近实时搜索,数据更新在Elasticsearch中几乎是完全同步的。
版本 : 目前Elasticsearch最新的版本是6.4.1,我们使用这个版本6.2.4
需要JDK1.8及以上
2.了解搜索技术
2.1. 搜索引擎的种类
搜索引擎按照功能通常分为垂直搜索和综合搜索。
1、垂直搜索是指专门针对某一类信息进行搜索。
例如:会搜网 主要做商务搜索的,并且提供商务信息。除此之外还有爱看图标网、职友集等。
2、综合搜索是指对众多信息进行综合性的搜索。
例如:百度、谷歌、必应、搜狗、360搜索等。
- 1
- 2
- 3
- 4
2.2 倒排索引
以我的理解就是:我们对数据库原始的数据根据字或词进行索引,创建倒排索引数据区域,记录字或词在文档中出现位置(id列表)。
用户有查询需求时,先访问倒排索引数据区域(下图),得出文档id列表后,通过文档id即可快速,准确的通过上图找到具体的文档内容。
3.Elasticsearch安装
3.1.安装和配置
3.1.1 下载
下载地址:https://www.elastic.co/downloads/past-releases
3.2.2 安装
elasticsearch无需安装,解压即用。双击运行
可以看到绑定了两个端口:
- 9300:java程序访问的端口
- 9200:浏览器、postman访问接口
我们在浏览器中访问:http://127.0.0.1:9200
3.4.安装Head插件
3.4.1.什么是Head
ealsticsearch只是后端提供各种api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasticsearch的客户端工具,类似mysql的sqlyog或者navicat
elasticsearch-head配置包,下载地址:https://github.com/mobz/elasticsearch-head
3.4.2.安装
- es5以上版本安装head需要安装node和grunt
第一步:从地址:https://nodejs.org/en/download/ 下载相应系统的msi,双击安装。
第二步:安装完成用cmd进入安装目录执行 node -v可查看版本号
第三步:执行 npm install -g grunt-cli 安装grunt ,安装完成后执行grunt -version查看是否安装成功,会显示安装的版本号
第四步:进入E:\environment2\elasticsearch-head-master文件夹,执行npm install命令
第五步:运行head插件,下面命令二选一
- 命令一:npm run start
- 命令二:grunt server
第六步:访问9100端口
3.4.3.配置运行
第一步:进入es安装目录下的config目录,修改elasticsearch.yml文件.在文件的末尾加入以下代码
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
- 1
- 2
- 3
- 4
然后去掉network.host: 192.168.0.1的注释并改为network.host: 0.0.0.0,去掉cluster.name;node.name;http.port的注释(也就是去掉#)
第二步:双击elasticsearch.bat重启es
第三步:在https://github.com/mobz/elasticsearch-head中下载head插件,选择下载zip
第四步:解压到指定文件夹下,D:\environment\elasticsearch-head-master 进入该文件夹,修改D:\environment\elasticsearch-head-master\Gruntfile.js 在对应的位置加上hostname:’*’、
第五步:在D:\environment\elasticsearch-head-master 下执行npm install 安装完成后执行grunt server 或者npm run start 运行head插件,如果不成功重新安装grunt。成功如下
4.入门案例(整合Springboot)
4.1 pom导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
- 1
- 2
- 3
- 4
4.2 application.yml文件配置
spring:
data:
elasticsearch:
cluster-name: my-application
cluster-nodes: 127.0.0.1:9300
- 1
- 2
- 3
- 4
- 5
4.3.索引操作
- 创建索引和映射
SpringBoot-data-elasticsearch提供了面向对象的方式操作elasticsearch业务:将商品的信息存入elasticsearch,并且执行搜索操作
实体类:
public class Item {
private Long id;
private String title; //标题
private String category;// 分类
private Double price; // 价格
private String images; // 图片地址
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
映射—注解:
Spring Data通过注解来声明字段的映射属性,有下面的三个注解:
- `@Document` 作用在类,标记实体类为文档对象,一般前两个属性
- indexName:对应索引库名称
- type:对应在索引库中的类型
- shards:分片数量,默认5
- replicas:副本数量,默认1
- `@Id` 作用在成员变量,标记一个字段作为id主键
- `@Field` 作用在成员变量,标记为文档的字段,并指定字段映射属性:
- type:字段类型,是是枚举:FieldType,可以是text、long、short、date、integer、object等
- text:存储数据时候,会自动分词,并生成索引
- keyword:存储数据时候,不会分词建立索引
- Numerical:数值类型,分两类
- 基本数据类型:long、interger、short、byte、double、float、half_float
- 浮点数的高精度类型:scaled_float
- 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
- Date:日期类型
- elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
- index:是否索引,布尔类型,默认是true
- store:是否存储,布尔类型,默认是false
- analyzer:分词器名称,这里的`ik_max_word`即使用ik分词器
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
示例 :
@Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
public class Item {
@Id
private Long id;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String title; //标题
@Field(type = FieldType.Keyword)
private String category;// 分类
@Field(type = FieldType.Double)
private Double price; // 价格
@Field(index = false, type = FieldType.Keyword)
private String images; // 图片地址
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
ElasticsearchTemplate中提供了创建索引的API:
@Test
public void createIndex() {
// 创建索引,会根据Item类的@Document注解信息来创建
esTemplate.createIndex(Item.class);
// 配置映射,会根据Item类中的id、Field等字段来自动完成映射
esTemplate.putMapping(Item.class);
// 删除索引
esTemplate.deleteIndex(Item.class);
// 根据索引名字删除
//esTemplate.deleteIndex("item1");
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
操作数据:
public interface ItemRepository extends ElasticsearchRepository<Item,Long> {
}
- 1
- 2
@Autowired
private ItemRepository itemRepository;
@Test
public void index() {
//添加一个
Item item = new Item(1L, “小米手机7”, " 手机",“小米”, 3499.00, “http://image.baidu.com/13123.jpg”);
itemRepository.save(item);
<span class="token comment">//添加多个</span>
List<span class="token operator"><</span>Item<span class="token operator">></span> list <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ArrayList</span><span class="token operator"><</span><span class="token operator">></span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
list<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Item</span><span class="token punctuation">(</span><span class="token number">2</span>L<span class="token punctuation">,</span> <span class="token string">"坚果手机R1"</span><span class="token punctuation">,</span> <span class="token string">" 手机"</span><span class="token punctuation">,</span> <span class="token string">"锤子"</span><span class="token punctuation">,</span> <span class="token number">3699.00</span><span class="token punctuation">,</span> <span class="token string">"http://image.baidu.com/13123.jpg"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
list<span class="token punctuation">.</span><span class="token function">add</span><span class="token punctuation">(</span><span class="token keyword">new</span> <span class="token class-name">Item</span><span class="token punctuation">(</span><span class="token number">3</span>L<span class="token punctuation">,</span> <span class="token string">"华为META10"</span><span class="token punctuation">,</span> <span class="token string">" 手机"</span><span class="token punctuation">,</span> <span class="token string">"华为"</span><span class="token punctuation">,</span> <span class="token number">4499.00</span><span class="token punctuation">,</span> <span class="token string">"http://image.baidu.com/13123.jpg"</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
itemRepository<span class="token punctuation">.</span><span class="token function">saveAll</span><span class="token punctuation">(</span>list<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//elasticsearch中本没有修改,它的是该是先删除在新增,修改和新增是同一个接口,区分的依据就是id。</span>
Item item <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Item</span><span class="token punctuation">(</span><span class="token number">1</span>L<span class="token punctuation">,</span> <span class="token string">"苹果XSMax"</span><span class="token punctuation">,</span> <span class="token string">" 手机"</span><span class="token punctuation">,</span> <span class="token string">"小米"</span><span class="token punctuation">,</span> <span class="token number">3499.00</span><span class="token punctuation">,</span> <span class="token string">"http://image.baidu.com/13123.jpg"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
itemRepository<span class="token punctuation">.</span><span class="token function">save</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">//查询所有</span>
Iterable<span class="token operator"><</span>Item<span class="token operator">></span> list <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>itemRepository<span class="token punctuation">.</span><span class="token function">findAll</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 对某字段排序查找所有 Sort.by("price").descending() 降序 , Sort.by("price").ascending():升序</span>
Iterable<span class="token operator"><</span>Item<span class="token operator">></span> list <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>itemRepository<span class="token punctuation">.</span><span class="token function">findAll</span><span class="token punctuation">(</span>Sort<span class="token punctuation">.</span><span class="token function">by</span><span class="token punctuation">(</span><span class="token string">"price"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">ascending</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>Item item<span class="token punctuation">:</span>list<span class="token punctuation">)</span><span class="token punctuation">{</span>
System<span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>item<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
- 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
自定义查询1(在ItemRepository中):
Spring Data 的另一个强大功能,是根据方法名称自动实现功能。
比如:你的方法名叫做:findByTitle,那么它就知道你是根据title查询,然后自动帮你完成,无需写实现类。
- 1
- 2
- 3
当然,方法名称要符合一定的约定:
Keyword | Sample |
---|---|
And | `findByTitleAndPrice``findBy属性名1And属性名2 |
Or | findByTitleOrPrice |
Is = | findByTitle |
Not | findByTitleNot |
Between | findByPriceBetween |
LessThanEqual | findByPriceLessThan |
GreaterThanEqual | findByPriceGreaterThan |
Before | findByPriceBefore |
After | findByPriceAfter |
Like | findByNameLike |
StartingWith | findByNameStartingWith |
EndingWith | findByNameEndingWith |
Contains/Containing | findByNameContaining |
In | findByNameIn(Collection<String>names) |
NotIn | findByNameNotIn(Collection<String>names) |
Near | findByStoreNear |
True | findByAvailableTrue |
False | findByAvailableFalse |
OrderBy | findByAvailableTrueOrderByNameDesc |
例如:根据价格区间查询
定义: List<Item> findByPriceBetween(double price1, double price2);
使用: List<Item> list = this.itemRepository.findByPriceBetween(2000.00, 3500.00);
- 1
- 2
- 3
自定义查询2(在ItemRepository中):
matchQuery :词条匹配 /(不分词)
TermQuery :词条匹配 /(分词)
wildcardQuery :通配符匹配
fuzzyQuery :模糊匹配
booleanQuery :布尔匹配
1.MUST和MUST:交集。
2.MUST和MUST_NOT:表示查询结果中不能包含MUST_NOT所对应得查询子句的检索结果。
3.SHOULD与MUST_NOT:连用时,功能同MUST和MUST_NOT。
4.SHOULD与MUST连用时,结果为MUST子句的检索结果,但是SHOULD可影响排序。
5.SHOULD与SHOULD:并集。
6.MUST_NOT和MUST_NOT:无意义,检索无结果。
NativeSearchQueryBuilder :Spring提供的一个查询条件构建器,帮助构建json格式的请求体