ElasticSearch学习

ElasticSearch

实际使用的场景:
1.在海量数据中,使用Mysql进行模糊查询,效率太低,且%在前不走索引
2.在日常场景中要求如果关键词不准确也可以搜索想要的效果
3.将搜索的关键词标明

ElasticSearch

提供存储、检索、分析功能
使用java语言的并且基于Lucene编写的搜索引擎,提供了分布式的全文索索功能。
分布式:主要为了突出横向扩展的能力
全文检索:将一段词语进行分词,并将分出的单次统一放入分词库中,在搜索时,根据关键词去分词库中检索,找到匹配的内容。(倒排索引)

ES:提供了一个统一的基于Restful风格的WEB接口,只需要发送一个HTTP请求,并且根据请求方式的不同,携带参数执行相应的功能

倒排索引

ES服务:将数据进行分词,存放入分词库中,建立索引
当客户端进行检索的时候,
1.query:根据关键词去分词库中检索内容
2.fetch:根据去分词库中检索到的id,直接拉取指定的数据
3.相关性比较

相关概念

Index 索引 相当于MySql中的database
Type 类型 相当于MySql中的Table(6.0以前)
Document 文档(json) 相当于MySql中的记录
Filed 属性 相当于MySql中的列名

相关操作:
增加操作:
1.put 增加、修改操作。必须指定id,因此通常修改
2.post 增加操作 不指定id,自动生成ID,会不断的增加
有id会修改id对应的数据,同时新增版本号
Put具有幂等性,post没有幂等性

查询数据:
1.get 获取 索引/type/id
用于并发控制,乐观锁,根据序列号进行CAS:
_seq_no 序列号
_primary_term

更新:

  1. post 索引/type/id/_update
    “doc”:{
    }
    与元数据对比,相同版本号version,seq_no不增加
    不带update和doc则会增加版本号
    2.put也类似

删除文档:
Delete 索引/type/id

批量导入 POST 索引/type/_bulk
{“index”:{"_id":“1”}} action,id
{“name”:“Hoe”} 具体内容

操作ES

1、复杂检索
ES支持两种基本检索方式:
1.REST request URI请求 发送检索参数(URI+检索参数)

GET bank/_search?q=*&sort=account_number:asc

动作 索引/操作?请求所有&属性排序规则

2.REST request body发送(uri+请求体)
Query DSL

GET bank/_search
{
		"query":{"match_all":{} //查询规则
		},
		"sort":[
			{
			"account_number":"asc"  //排序规则
			}
		],
		"from":5,
		"size":5,
		"_source":["balance","first_name"]  //返回部分列
}

2.全文检索 match

GET bank/_search
{
		"query":{
		"match":{
			"address":"Kings" 
			} //查询规则,模糊查询,倒排索引
		}
}

短语匹配,匹配完整短语

GET bank/_search
{
		"query":{
		"match_phrase":{
			"address":"mill lane" 
			} //必须匹配完整短语,不进行分词
		}
}

多字段匹配

GET bank/_search
{
		"query":{
		"multi_match":{
			"query":"mill" ,
			"fields":["address","city"]
			} //任意field包含query的条件,进行分词
		}
}

bool复合查询

GET bank/_search
{
		"query":{
		"bool":{
			"must":[
			{"match":{
				"gender":"F",
			}},
			{"match":{
				"address":"mill",
			}}
			],//两个条件必须满足
			"must_not":[
			{"match":{
				"age":"38",
			}},
			],//必须不满足
			"should":[
				{"match":{
				"lastname":"wallace",
			}}
			]//应该匹配
			} 
		}
}

结果过滤filter , 不会进行相关性得分

GET /bank/_search
{
  "query": {
    "bool": {
      "must": { "match_all": {} },
      "filter": {
        "range": {
          "balance": {
            "gte": 20000,
            "lte": 30000
          }
        }
      }
    }
  }
}

3.执行聚合
提供分组和提取数据的能力

GET bank/_search
{
		"query":{
		"match":{"address":"mill"}
		} ,
		"aggs":{//按年龄进行聚合
			"ageAgg":{
				"term":{
					"field":"age",
					"size":10
				}
			}
		}
		
}

IK分词器

es中标准分析器:analyzer:standard 这个词解析
中文分词:IK分词器
放入es中plugins目录–插件
测试:
分词器:

POST _analyze
{
		"analyzer":"ik_max_word",
		"text":"我是中国人"
		
}

自定义扩展词库
1.新建项目,ik向项目中发送请求
2.nginx,ik分词器向nginx发送请求
在IK中配置远程扩展字典

整合JAVA

java操作es

链接es
9200端口:HTTP
发送请求,Elasticseach-Rest-Clinet,封装es操作

高阶RestClient

public static RestHighLevelClient getClient(){

        HttpHost httpHost = new HttpHost("192.168.1.100",9200);

        RestClientBuilder clientBuilder = RestClient.builder(httpHost);


        RestHighLevelClient client = new RestHighLevelClient(clientBuilder);

        return client;
    }

检索数据

IndexRequest indexRequest = new IndexRequest("users");
        indexRequest.id("1");
//        indexRequest.source("username", "zhangsan", "age", 18, "gender", "男");

        User user = new User();
        String jsonString = JSON.toJSONString(user);
        indexRequest.source(jsonString, XContentType.JSON);

        IndexResponse index = client.index(indexRequest,...)

复杂检索

//1.创建检索请求
        SearchRequest searchRequest = new SearchRequest();
        //指定索引
        searchRequest.indices("bank");
        //指定DSL,检索条件
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.query(QueryBuilders.matchQuery("address","mill"));
//        searchSourceBuilder.from();
//        searchSourceBuilder.size();
        //聚合-按年龄进行聚合
        searchSourceBuilder.aggregation(AggregationBuilders.terms("ageAgg").field("age").size(10));

        searchRequest.source(searchSourceBuilder);

        //2.执行检索
        SearchResponse searchResponse = client.search(searchRequest,...)

        //3.分析结果
        System.out.println(searchResponse.toString());

组合查询

按关键词

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();

        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        if (!StringUtils.isEmpty(关键词)) {
            boolQueryBuilder.must(QueryBuilders.matchQuery("title",关键词))}

分析结果–封装成指定的格式:

//获取命中记录
SearchHits hits = response.getHits();
//总记录数
long total = hits.getTotalHits().value;
//每一条记录
for (SearchHit hit : hits.getHits()) {
String sourceString = hit.getSourceAsString();
JSON.parseObject()//解析成类保存进行显示
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!关于学习Elasticsearch,我可以给你一些指导。Elasticsearch是一个开源的分布式搜索和分析引擎,主要用于快速、实时地存储、搜索和分析大量数据。下面是一些学习Elasticsearch的步骤: 1. 了解基本概念:开始学习Elasticsearch之前,你需要了解一些基本的概念,比如索引(index)、类型(type)、文档(document)、字段(field)等。这将帮助你更好地理解Elasticsearch的工作原理。 2. 安装和配置:根据你的操作系统,你可以从Elasticsearch官方网站下载并安装合适的版本。安装完成后,你需要进行适当的配置,如设置集群名称、分配内存等。 3. 学习REST API:Elasticsearch提供了丰富的REST API,用于与其进行交互。了解如何使用这些API来索引、搜索和删除数据是学习Elasticsearch的重要一步。 4. 索引和搜索数据:学习如何创建索引、添加文档以及执行搜索操作是使用Elasticsearch的关键。掌握查询语法、过滤器、聚合操作等功能可以帮助你更有效地使用Elasticsearch。 5. 数据建模和分析:学习如何设计合适的数据模型和映射,以及如何使用Elasticsearch进行数据分析和可视化是提高你的技能的重要一步。 6. 扩展和优化:学习如何在生产环境中扩展和优化Elasticsearch集群是非常重要的。了解如何分片、复制、调优性能等将帮助你更好地管理和维护你的数据。 7. 学习资源:除了官方文档,还有很多优秀的学习资源可供参考,如书籍、教程和在线课程等。利用这些资源可以更系统地学习和掌握Elasticsearch。 希望这些步骤能对你学习Elasticsearch有所帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值