Chinaunix首页 | 论坛 | 博客
  • 博客访问: 6644948
  • 博文数量: 915
  • 博客积分: 17977
  • 博客等级: 上将
  • 技术积分: 8846
  • 用 户 组: 普通用户
  • 注册时间: 2005-08-26 09:59
个人简介

一个好老好老的老程序员了。

文章分类

全部博文(915)

文章存档

2022年(9)

2021年(13)

2020年(10)

2019年(40)

2018年(88)

2017年(130)

2015年(5)

2014年(12)

2013年(41)

2012年(36)

2011年(272)

2010年(1)

2009年(53)

2008年(65)

2007年(47)

2006年(81)

2005年(12)

分类: 大数据

2021-04-26 14:04:27

与Lucene和solr中的概念类似。
另外,在SolrCloud中,有一些集群相关的概念,在Elasticsearch也有类似的:

  • 索引集(Indices,index的复数):逻辑上的完整索引
  • 分片(shard):数据拆分后的各个部分
  • 副本(replica):每个分片的复制

要注意的是:Elasticsearch本身就是分布式的,因此即便你只有一个节点,Elasticsearch默认也会对你的数据进行分片和副本操作,当你向集群添加新数据时,数据也会在新加入的节点中进行平衡。

一、创建索引
Elasticsearch采用Rest风格API,因此其API就是一次http请求,你可以用任何工具发起http请求
创建索引的请求格式:

  • 请求方式:PUT
  • 请求路径:/索引库名


点击(此处)折叠或打开

  1. {

  2. "settings": { "number_of_shards": 3, "number_of_replicas": 2 }
  3. }


查看索引设置:
Get请求可以帮我们查看索引信息,格式:
GET /索引库名

二、删除索引
删除索引使用DELETE请求
DELETE /索引库名

三、映射配置
索引库有了,接下来肯定是添加数据。不过数据存储到索引库中,必须指定一些相关属性,在学习Lucene中我们都见到过,包括但不限于以下内容:
字段的数据类型
是否要存储
是否要索引
是否分词
分词器种类
只有配置清楚,Elasticsearch才会帮我们进行索引库的创建(不一定)
1.创建映射字段
PUT /索引库名/_mapping/类型名称

点击(此处)折叠或打开

  1. {
  2.     "properties": {
  3.         "字段名": { "type": "类型", "index": true, "store": true, "analyzer": "分词器" }
  4.     }
  5. }


类型名称:就是前面讲的type的概念,类似于数据库中的不同表
字段名:任意填写 ,可以指定许多属性,例如:
type:类型,可以是text、long、short、date、integer、object等
index:是否索引,默认为true
store:是否存储,默认为false
analyzer:分词器,这里的ik_max_word即使用ik分词器
2.查看映射关系
GET /索引库名/_mapping
3.字段属性详解
说几个关键的:
String类型,又分两种:text:可分词,不可参与聚合 keyword:不可分词,数据会作为完整字段进行匹配,可以参与聚合
Numerical:数值类型,分两类:基本数据类型:long、interger、short、byte、double、float、half_float
浮点数的高精度类型:scaled_float 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。
Date:日期类型。elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。
index影响字段的索引情况。index的默认值就是true,也就是说你不进行任何配置,所有字段都会被索引。
boost:激励因子,这个与lucene中一样
4.新增数据
通过POST请求,可以向一个已经存在的索引库中添加数据。
POST /索引库名/类型名

点击(此处)折叠或打开

  1. {
  2. "key":"value"
  3. }


5.修改数据
把刚才新增的请求方式改为PUT,就是修改了。不过修改必须指定id

二:查询
我们从4块来讲查询:

  • 基本查询
  • _source过滤
  • 结果过滤
  • 高级查询
  • 排序

1.基本查询
GET /索引库名/_search

点击(此处)折叠或打开

  1. {
  2.    "query":{ "查询类型":{ "查询条件":"查询条件值" }
  3. }


2、多字段查询(multi_match)
GET /_search

点击(此处)折叠或打开

  1. {

  2. "query":{ "multi_match": { "query": "小米", "fields": [ "title", "subTitle" ]    }
  3. }


3.词条匹配(term)
GET /_search

点击(此处)折叠或打开

  1. {

  2.     "query":{ "term":{ "price": } }
  3. }
4.多词条精确匹配


GET /_search

点击(此处)折叠或打开

  1. {

  2. "query":{ "terms":{ "price":[2699.00,2899.00,3899.00]
  3.     }
  4. }
  5. }


三、聚合
image.png
基本概念
image.png
image.png
聚合为桶
image.png
桶内度量
image.png
GET /cars/_search

点击(此处)折叠或打开

  1. {
  2. "size" : 0, "aggs" : { "popular_colors" : { "terms" : { "field" : "color"
  3.         },
  4.         "aggs":{
  5.             "avg_price": {
  6.                "avg": {
  7.                   "field": "price"
  8.                }
  9.             }
  10.         }
  11.     }
  12. }
  13. }


五、Spring Data Elasticsearch
image.png
Spring Data 是的使命是给各种数据访问提供统一的编程接口,不管是关系型数据库(如MySQL),还是非关系数据库(如Redis),或者类似Elasticsearch这样的索引数据库。从而简化开发人员的代码,提高开发效率。
image.png
image.png
示例:

点击(此处)折叠或打开

  1. @Document(indexName = "item",type = "docs", shards = 1, replicas = 0)
  2. public class Item {

  3. @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.Keyword) private String brand; // 品牌 @Field(type = FieldType.Double) private Double price; // 价格 @Field(index = false, type = FieldType.Keyword) private String images; // 图片地址
  4. }


image.png
image.png
删除索引:
image.png
自定义查询:
image.png
分页查询:

点击(此处)折叠或打开

  1. @Test
  2. public void searchByPage(){

  3. // 构建查询条件 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加基本分词查询 queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机")); // 分页: int page = 0; int size = 2;
  4. queryBuilder.withPageable(PageRequest.of(page,size)); // 搜索,获取结果 Page items = this.itemRepository.search(queryBuilder.build()); // 总条数 long total = items.getTotalElements(); System.out.println("总条数 = " + total); // 总页数 System.out.println("总页数 = " + items.getTotalPages()); // 当前页 System.out.println("当前页:" + items.getNumber()); // 每页大小 System.out.println("每页大小:" + items.getSize());

  5. for (Item item : items) { System.out.println(item);
  6. }
  7. }


排序:
排序也通用通过NativeSearchQueryBuilder完成:

点击(此处)折叠或打开

  1. @Test
  2. public void searchAndSort(){

  3. // 构建查询条件 NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 添加基本分词查询 queryBuilder.withQuery(QueryBuilders.termQuery("category", "手机")); // 排序 queryBuilder.withSort(SortBuilders.fieldSort("price").order(SortOrder.ASC)); // 搜索,获取结果 Page items = this.itemRepository.search(queryBuilder.build()); // 总条数 long total = items.getTotalElements(); System.out.println("总条数 = " + total);

  4. for (Item item : items) { System.out.println(item);
  5. }
  6. }
聚合:

点击(此处)折叠或打开

  1. @Test
  2. public void testAgg(){

  3. NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 不查询任何结果 queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null)); // 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brand queryBuilder.addAggregation(
  4.     AggregationBuilders.terms("brands").field("brand")); // 2、查询,需要把结果强转为AggregatedPage类型 AggregatedPage aggPage = (AggregatedPage) this.itemRepository.search(queryBuilder.build()); // 3、解析 // 3.1、从结果中取出名为brands的那个聚合, // 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型 StringTerms agg = (StringTerms) aggPage.getAggregation("brands"); // 3.2、获取桶 List buckets = agg.getBuckets(); // 3.3、遍历 for (StringTerms.Bucket bucket : buckets) { // 3.4、获取桶中的key,即品牌名称 System.out.println(bucket.getKeyAsString()); // 3.5、获取桶中的文档数量 System.out.println(bucket.getDocCount());
  5. }
  6. }


点击(此处)折叠或打开

  1. @Test
  2. public void testAgg(){

  3. NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder(); // 不查询任何结果 queryBuilder.withSourceFilter(new FetchSourceFilter(new String[]{""}, null)); // 1、添加一个新的聚合,聚合类型为terms,聚合名称为brands,聚合字段为brand queryBuilder.addAggregation(
  4.     AggregationBuilders.terms("brands").field("brand")); // 2、查询,需要把结果强转为AggregatedPage类型 AggregatedPage aggPage = (AggregatedPage) this.itemRepository.search(queryBuilder.build()); // 3、解析 // 3.1、从结果中取出名为brands的那个聚合, // 因为是利用String类型字段来进行的term聚合,所以结果要强转为StringTerm类型 StringTerms agg = (StringTerms) aggPage.getAggregation("brands"); // 3.2、获取桶 List buckets = agg.getBuckets(); // 3.3、遍历 for (StringTerms.Bucket bucket : buckets) { // 3.4、获取桶中的key,即品牌名称 System.out.println(bucket.getKeyAsString()); // 3.5、获取桶中的文档数量 System.out.println(bucket.getDocCount());
  5. }
  6. }


阅读(796) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~