使用Elasticsearch7.10.2新版本,新手需要注意的那些事

使用Elasticsearch,新手需要注意的那些事

全文搜索属于最常见的需求,开源的 Elasticsearch (以下简称 Elastic)是目前全文搜索引擎的首选。简称es, 它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Github 都采用。
在这里插入图片描述
底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elasticsearch 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。
Elasticsearch是一个实时的分布式开放源代码全文本搜索和分析引擎。可从RESTful Web服务界面访问它,并使用无模式的JSON(JavaScript对象表示法)文档存储数据。它基于Java编程语言构建,因此Elasticsearch可以在不同平台上运行。它使用户能够以很高的速度浏览大量数据。

一 简单和复杂搜索(Kibana)

在这里插入图片描述

  1. GET demo/user/_search?q=name:张三 //使用Kibana测试查询
    
  2. GET demo/user/_search
    {
          
          
      "query": {
          
                 //复杂查询,排序,分页,高亮
        "match": {
          
          
          "name": "张三"
        }
      }
    }      
    
  3. GET demo/user/_search
    {
          
          
     "query": {
          
          
        "match": {
          
          
          "name": "张三"
        }
      },
      "_source": ["name","tag"] //结果过滤
    }
    
  4. "sort": [
        {
          
          
          "age": {
          
          
            "order": "asc"
          }
        }        //排序
      ]
    
  5.   "sort": [
        {
          
          
          "age": {
          
          
            "order": "asc"
          }
        }        
      ],
      "from": 0
      , "size": 20         //查询条数
    }
    
  6. GET kuangsheng/user/_search  //多条件查询
    {
          
          
      "query": {
          
          
        "bool": {
          
          
          "must": [  //"shoud"//相当于or "must_not"相当于not
            {
          
          
              "match": {
          
          
                "name": "李四"
              }
            },
            {
          
          
            "match": {
          
          
                "age": "25"
              }
            }
          ]
        }   
      }
    }
    
  7.  "filter": {
          
              //过滤查询
            "range":{
          
          
              "age":{
          
          
                "lt":23  //"gt"大于 "gte"大于等于 "lte"小于等于
              }
            }
          }
    
  8. 精确查询

  • 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类型不会被分词器解析

  1. 高亮查询
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

  1. 导入
<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/

  1. 配置连接客户端的地址
@Configuration
public class ElasticSearchClintConfig {
    
    

    @Bean
    public RestHighLevelClient restHighLevelClient() {
    
    
        RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(
                        new HttpHost("localhost", 9200, "http")));
        return client;
    }
}
  1. 测试
	@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);
	}
  1. 添加文档
    @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());
    }
  1. 获取文档
@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);
    }
  1. elasticsearch jar包中对update,get,search,delete等都封装了一系列方法

在这里插入图片描述

推荐狂神说的Elasticsearch教程:www.kuangstudy.com

猜你喜欢

转载自blog.csdn.net/weixin_44313584/article/details/113824392