简介 : 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java开发的,并做为Apache许可条款下的开放源码发布,是当前流行的企业级搜索引擎。javascript
Elasticsearch官网:https://www.elastic.co/cn/products/elasticsearchjava
特色:node
版本 : 目前Elasticsearch最新的版本是6.4.1,咱们使用这个版本6.2.4mysql
须要JDK1.8及以上
git
搜索引擎按照功能一般分为垂直搜索和综合搜索。github
1、垂直搜索是指专门针对某一类信息进行搜索。 例如:会搜网 主要作商务搜索的,而且提供商务信息。除此以外还有爱看图标网、职友集等。 2、综合搜索是指对众多信息进行综合性的搜索。 例如:百度、谷歌、必应、搜狗、360搜索等。
以个人理解就是:咱们对数据库原始的数据根据字或词进行索引,建立倒排索引数据区域,记录字或词在文档中出现位置(id列表)。
用户有查询需求时,先访问倒排索引数据区域(下图),得出文档id列表后,经过文档id便可快速,准确的经过上图找到具体的文档内容。
web
下载地址:https://www.elastic.co/downloads/past-releasesspring
elasticsearch无需安装,解压即用。双击运行
能够看到绑定了两个端口:
sql
咱们在浏览器中访问:http://127.0.0.1:9200数据库
ealsticsearch只是后端提供各类api,那么怎么直观的使用它呢?elasticsearch-head将是一款专门针对于elasticsearch的客户端工具,相似mysql的sqlyog或者navicat
elasticsearch-head配置包,下载地址:https://github.com/mobz/elasticsearch-head
第一步:从地址: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插件,下面命令二选一
第六步:访问9100端口
第一步:进入es安装目录下的config目录,修改elasticsearch.yml文件.在文件的末尾加入如下代码
http.cors.enabled: true http.cors.allow-origin: "*" node.master: true node.data: true
而后去掉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。成功以下
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
spring: data: elasticsearch: cluster-name: my-application cluster-nodes: 127.0.0.1:9300
SpringBoot-data-elasticsearch提供了面向对象的方式操做elasticsearch业务:将商品的信息存入elasticsearch,而且执行搜索操做
实体类:
public class Item { private Long id; private String title; //标题 private String category;// 分类 private Double price; // 价格 private String images; // 图片地址 }
映射—注解:
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分词器
示例 :
@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; // 图片地址 }
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"); }
操做数据:
public interface ItemRepository extends ElasticsearchRepository<Item,Long> { }
@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); //添加多个 List<Item> list = new ArrayList<>(); list.add(new Item(2L, "坚果手机R1", " 手机", "锤子", 3699.00, "http://image.baidu.com/13123.jpg")); list.add(new Item(3L, "华为META10", " 手机", "华为", 4499.00, "http://image.baidu.com/13123.jpg")); itemRepository.saveAll(list); //elasticsearch中本没有修改,它的是该是先删除在新增,修改和新增是同一个接口,区分的依据就是id。 Item item = new Item(1L, "苹果XSMax", " 手机", "小米", 3499.00, "http://image.baidu.com/13123.jpg"); itemRepository.save(item); //查询全部 Iterable<Item> list = this.itemRepository.findAll(); // 对某字段排序查找全部 Sort.by("price").descending() 降序 , Sort.by("price").ascending():升序 Iterable<Item> list = this.itemRepository.findAll(Sort.by("price").ascending()); for (Item item:list){ System.out.println(item); } }
自定义查询1(在ItemRepository中):
Spring Data 的另外一个强大功能,是根据方法名称自动实现功能。 好比:你的方法名叫作:findByTitle,那么它就知道你是根据title查询,而后自动帮你完成,无需写实现类。
固然,方法名称要符合必定的约定:
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);
自定义查询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格式的请求体