使用Elasticsearch,新手需要注意的那些事
全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。简称es, 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用。
底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elasticsearch 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
Elasticsearch是一个实时的分布式开放源代码全文本搜索和分析引擎。可从RESTful Web服务界面访问它,并使用无模式的JSON(JavaScript对象表示法)文档存储数据。它基于Java编程语言构建,因此Elasticsearch可以在不同平台上运行。它使用户能够以很高的速度浏览大量数据。
一 简单和复杂搜索(Kibana)
-
GET demo/user/_search?q=name:张三 //使用Kibana测试查询
-
GET demo/user/_search { "query": { //复杂查询,排序,分页,高亮 "match": { "name": "张三" } } }
-
GET demo/user/_search { "query": { "match": { "name": "张三" } }, "_source": ["name","tag"] //结果过滤 }
-
"sort": [ { "age": { "order": "asc" } } //排序 ]
-
"sort": [ { "age": { "order": "asc" } } ], "from": 0 , "size": 20 //查询条数 }
-
GET kuangsheng/user/_search //多条件查询 { "query": { "bool": { "must": [ //"shoud"//相当于or "must_not"相当于not { "match": { "name": "李四" } }, { "match": { "age": "25" } } ] } } }
-
"filter": { //过滤查询 "range":{ "age":{ "lt":23 //"gt"大于 "gte"大于等于 "lte"小于等于 } } }
-
精确查询
-
term 直接查询(精确),是代表完全匹配
-
match 使用分词器(先分析文档,然后在进行查询)
{
"query":{
"term" : {
"price" : 100
}
通常当查找一个精确值的时候,我们不希望对查询进行评分计算。只希望对文档进行包括或排除的计算,所以我们会使用 constant_score 查询以非评分模式来执行 term 查询并以一作为统一评分。最终组合的结果是一个 constant_score 查询,它包含一个 term 查询:
GET /demo/users/_search
{
"query":{
"constant_score":{ //我们用constant_score将term查询转化为过滤器
"filter":{
"term" : { //我们之前看到过的term查询
"price" : 100
}
最简单的一个match例子:
查询和"张三"这个查询语句匹配的文档。
{
"query": {
"match": {
"content" : {
"query" : "张三"
}
}
}
}
注意 text keyword类型不会被分词器解析
- 高亮查询
GET kuangsheng/user/_search
{
"query": {
"match": {
"name": "张三"
}
},
"highlight": { //自定义样式 如:"pre_tags":"<p>" "post_tags":"</p>"
"fields": {
"name":{} //name类型高亮
}
}
}
设置高亮后的elasticsearch返回值
{
"took" : 43,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 2.5226097,
"hits" : [
{
"_index" : "kuangsheng",
"_type" : "user",
"_id" : "2",
"_score" : 2.5226097,
"_source" : {
"name" : "张三",
"age" : "25",
"desc" : "gggg",
"tag" : "渣男"
},
"highlight" : {
"name" : [
"<em>张</em><em>三</em>" //高亮默认标签
]
}
}
]
}
}
二 SpringBoot集成Elasticsearch
- 导入
<dependency>
<groupId>org.elasticsearch.client </groupId>
<artifactId >elasticsearch-rest-high-level-client</artifactId>
<version>7.12.0</version>
</dependency>
官方文档:https://www.elastic.co/guide/en/elasticsearch/client/
- 配置连接客户端的地址
@Configuration
public class ElasticSearchClintConfig {
@Bean
public RestHighLevelClient restHighLevelClient() {
RestHighLevelClient client = new RestHighLevelClient(
RestClient.builder(
new HttpHost("localhost", 9200, "http")));
return client;
}
}
- 测试
@Autowired
@Qualifier("restHighLevelClient")
private RestHighLevelClient client;
@Test //测试索引创建
void testCreateIndex() throws IOException {
CreateIndexRequest request = new CreateIndexRequest("kuang_index");
CreateIndexResponse createIndexResponse = client.indices().create(request, RequestOptions.DEFAULT);
System.out.println(createIndexResponse);
}
- 添加文档
@Test
void into() throws IOException {
//创建对象
User user = new User("张三", 33);
//创建请求
IndexRequest request = new IndexRequest("kuang_index");
//设置规则
request.id("1").timeout("1s");
//将数据放入请求
request.source(JSON.toJSONString(user), XContentType.JSON);
//发送请求,获取响应结果
IndexResponse index = client.index(request, RequestOptions.DEFAULT);
System.out.println(index.toString());
}
- 获取文档
@Test
void getDocument() throws IOException {
GetRequest request = new GetRequest("kuang_index", "1");
GetResponse response = client.get(request, RequestOptions.DEFAULT);
System.out.println(response.getSourceAsString());
System.out.println(response);
}
- elasticsearch jar包中对update,get,search,delete等都封装了一系列方法
推荐狂神说的Elasticsearch教程:www.kuangstudy.com