Elasticsearch入门


Elasticsearch入门

什么是Elasticsearch

Elasticsearch是一个基于Lucene搜索引擎的分布式、开源、RESTful搜索和分析引擎。它提供了一个快速、稳定、可靠的搜索解决方案,能够处理大量的结构化或非结构化数据,并支持全文搜索、地理位置搜索、自动完成、聚合分析等功能。

以下是一些Elasticsearch的重要概念和特点:

  1. 索引(Index):Elasticsearch中的数据存储在索引中,每个索引包含一个或多个文档类型(Type),每个文档类型包含一个或多个文档(Document)。
  2. 分片和副本(Sharding and Replication):Elasticsearch将索引分成多个分片存储在不同的节点上,以提高搜索和性能。此外,Elasticsearch还支持副本,以提高可用性和容错能力。
  3. 节点(Node):Elasticsearch集群中的每个服务器称为节点,每个节点都是一个完整的搜索引擎,可以存储和处理数据。
  4. RESTful API:Elasticsearch使用RESTful API来提供搜索和分析功能,使其易于与其他系统集成。
  5. 查询DSL(Domain Specific Language):Elasticsearch提供了一个基于JSON的查询DSL,使用户可以使用简单的语法构建高级查询。
  6. 聚合(Aggregation):Elasticsearch支持各种聚合函数,例如平均值、最大值、最小值、求和等,以及基于时间、地理位置、范围等维度的聚合。
  7. 实时搜索(Real-time search):Elasticsearch支持实时搜索,即索引中的新数据可以立即被搜索到。
  8. 开放性(Openness):Elasticsearch是一个开源、可扩展、可定制的搜索引擎,可以与各种数据源和系统集成。

Elasticsearch的相关语法

  1. 索引操作语法

    1. 创建索引:

      PUT http:127.0.0.1:9200/index_name
      
    2. 删除索引:

      DELETE http:127.0.0.1:9200/index_name
      
    3. 查询所有索引:

      GET http:127.0.0.1:9200/_cat/indices
      
  2. 文档操作语法

    1. 创建文档:

      POST http:127.0.0.1:9200/index_name/_doc
      
      {
          "field1": "value1",
          "field2": "value2",
          ...
      }
      
    2. 更新文档:

      POST http:127.0.0.1:9200/index_name/_update/document_id
      
      {
          "doc": {
              "field1": "new_value1",
              "field2": "new_value2",
              ...
          }
      }
      
    3. 删除文档:

      DELETE http:127.0.0.1:9200/index_name/_doc/document_id
      
    4. 获取文档:

      GET http:127.0.0.1:9200/index_name/_doc/document_id
      
  3. 搜索操作语法

    1. 简单搜索:

      GET http:127.0.0.1:9200/index_name/_search?q=<query>
      
    2. 使用查询DSL进行搜索:

      POST http:127.0.0.1:9200/index_name/_search
      
      {
          "query": {
              <query DSL>
          }
      }
      
    3. 聚合搜索:

      POST http:127.0.0.1:9200/index_name/_search
      
      {
          "aggs": {
              <aggregation DSL>
          },
          "query": {
              <query DSL>
          }
      }
      
  4. 查询DSL语法

    1. 匹配查询:

      {
          "match": {
              "field": "value"
          }
      }
      
    2. 多字段匹配查询:

      {
          "multi_match": {
              "query": "value",
              "fields": ["field1", "field2"]
          }
      }
      
    3. 范围查询:

      {
          "range": {
              "field": {
                  "gte": 10,
                  "lte": 20
              }
          }
      }
      
    4. 过滤查询:

      {
          "bool": {
              "filter": {
                  "term": {
                      "field": "value"
                  }
              }
          }
      }
      
    5. 聚合查询:

      {
          "aggs": {
              "agg_name": {
                  "<aggregation_type>": {
                      "field": "field_name"
                  }
              }
          }
      }
      
  5. 查询字符串查询(Query String Query):这是一种简单的语法,允许用户在搜索框中输入查询字符串,Elasticsearch将解析该字符串并返回匹配的结果。例如:

    GET http:127.0.0.1:9200/my_index/_search?q=user:john
    // 这将返回所有包含"user"字段中包含"john"的文档。
    
  6. 基于JSON的查询DSL(Query DSL):这是一种更高级的语法,允许用户构建更复杂的查询。例如:

    GET http:127.0.0.1:9200/my_index/_search
    // 这将返回所有包含"user"字段匹配"john"的文档。
    
    {
      "query": {
        "match": {
          "user": "john"
        }
      }
    }
    
  7. 过滤器(Filter):过滤器可以用于限制搜索结果,例如基于时间、地理位置、数据范围等限制。例如:

    GET http:127.0.0.1:9200/my_index/_search
    // 这将返回所有"user"字段匹配"john"并且"age"字段大于等于18的文档。
    
    {
      "query": {
        "bool": {
          "must": {
            "match": {
              "user": "john"
            }
          },
          "filter": {
            "range": {
              "age": {
                "gte": 18
              }
            }
          }
        }
      }
    }
    
  8. 聚合(Aggregations):聚合函数可以用于计算结果的统计信息,例如平均值、最大值、最小值、求和等。例如:

    GET http:127.0.0.1:9200/my_index/_search
    // 这将返回所有文档中"age"字段的平均值。
    
    {
      "aggs": {
        "avg_age": {
          "avg": {
            "field": "age"
          }
        }
      }
    }
    

Elasticsearch的优缺点?

Elasticsearch作为一种分布式、开源、文本搜索和分析引擎,具有以下优点和缺点:

优点:

  1. 高性能:Elasticsearch具有快速的搜索和分析能力,能够处理大量的结构化和非结构化数据,并支持实时搜索和聚合分析。
  2. 可扩展性:Elasticsearch是基于分布式架构设计的,可以在多个节点上存储和处理数据,能够轻松应对数据量的增长和高并发查询请求。
  3. 易用性:Elasticsearch提供了简单易用的RESTful API和基于JSON的查询DSL,使用户可以轻松构建高级查询和聚合分析。
  4. 开放性:Elasticsearch是一个开源、可定制和可扩展的搜索引擎,可以与各种数据源和系统集成。
  5. 多样化的用途:Elasticsearch不仅可以作为搜索引擎使用,还可以用于日志分析、安全分析、业务分析等各种用途。

缺点:

  1. 复杂性:Elasticsearch作为一种分布式系统,具有复杂的架构和配置,需要一定的学习和实践经验才能使用和管理。
  2. 学习曲线:Elasticsearch具有一定的学习曲线,需要用户掌握查询语法、索引设计、分片和副本、性能调优等方面的知识。
  3. 硬件要求:Elasticsearch需要运行在一组高性能的服务器上,需要足够的存储空间、内存和带宽。
  4. 数据安全:由于Elasticsearch是开源的,因此需要用户自行负责数据的安全和防护,例如访问控制、加密和日志审计等方面。

Elasticsearch的使用场景

Elasticsearch是一种文本搜索和分析引擎,适用于以下场景:

  1. 搜索引擎:Elasticsearch可以用于构建全文搜索引擎,包括网页搜索、电商搜索、社交媒体搜索等各种用途。
  2. 日志分析:Elasticsearch可以用于实时分析大量的日志数据,包括应用程序日志、服务器日志、安全日志等。
  3. 业务分析:Elasticsearch可以用于分析业务数据,如销售数据、用户数据、产品数据等,进行聚合分析、可视化和报表生成等。
  4. 安全分析:Elasticsearch可以用于实时监测和分析网络攻击、恶意软件、数据泄露等安全事件,提供实时警报和响应。
  5. 全文检索:Elasticsearch可以用于构建文档检索系统、知识库搜索、法律文献检索等各种用途。
  6. 语音搜索:Elasticsearch可以用于构建语音搜索引擎,包括智能音箱、语音助手、语音识别等各种用途。

Elasticsearch如何整合Springboot?

整合Spring Boot和Elasticsearch可以实现在Spring Boot应用程序中使用Elasticsearch进行搜索和分析。以下是整合Spring Boot和Elasticsearch的步骤:

  1. 添加Elasticsearch依赖:在Spring Boot项目的pom.xml文件中添加Elasticsearch客户端的依赖,例如:

    <dependency>
        <groupId>org.elasticsearch.client</groupId>
        <artifactId>elasticsearch-rest-high-level-client</artifactId>
        <version>7.10.2</version>
    </dependency>
    
  2. 配置Elasticsearch客户端:在Spring Boot应用程序中配置Elasticsearch客户端,可以使用RestHighLevelClient类进行配置,例如:

    @Bean(destroyMethod = "close")
    public RestHighLevelClient client() {
        final ClientConfiguration clientConfiguration = ClientConfiguration.builder()
                .connectedTo("localhost:9200")
                .build();
    
        return RestClients.create(clientConfiguration).rest();
    }
    
  3. 定义实体类:定义需要存储到Elasticsearch中的实体类,例如:

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    @Builder
    public class Book {
        private String id;
        private String title;
        private String author;
        private String content;
        private LocalDateTime createTime;
    }
    
  4. 定义Elasticsearch仓库:定义Elasticsearch仓库接口,继承ElasticsearchRepository接口,例如:

    @Repository
    public interface BookRepository extends ElasticsearchRepository<Book, String> {
    }
    
  5. 实现业务逻辑:在Service层实现业务逻辑,例如:

    @Service
    public class BookServiceImpl implements BookService {
        @Autowired
        private BookRepository bookRepository;
    
        @Override
        public void save(Book book) {
            bookRepository.save(book);
        }
    
        @Override
        public void deleteById(String id) {
            bookRepository.deleteById(id);
        }
    
        @Override
        public Book findById(String id) {
            return bookRepository.findById(id).orElse(null);
        }
    
        @Override
        public List<Book> findByTitle(String title) {
            return bookRepository.findByTitle(title);
        }
    
        @Override
        public List<Book> findByAuthor(String author) {
            return bookRepository.findByAuthor(author);
        }
    
        @Override
        public List<Book> search(String keyword) {
            QueryBuilder queryBuilder = QueryBuilders.multiMatchQuery(keyword, "title", "author", "content");
    
            SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(queryBuilder);
    
            Iterable<Book> searchResult = bookRepository.search(sourceBuilder);
    
            List<Book> resultList = new ArrayList<>();
    
            searchResult.forEach(resultList::add);
    
            return resultList;
        }
    }
    
  6. 使用Elasticsearch:在Controller层接收请求,调用Service层实现业务逻辑,例如:

    @RestController
    @RequestMapping("/book")
    public class BookController {
        @Autowired
        private BookService bookService;
    
        @PostMapping
        public void save(@RequestBody Book book) {
            bookService.save(book);
        }
    
        @DeleteMapping("/{id}")
        public void deleteById(@PathVariable String id) {
            bookService.deleteById(id);
        }
    
        @GetMapping("/{id}")
        public Book findById(@PathVariable String id) {
            return bookService.findById(id);
        }
    
        @GetMapping
        public List<Book> search(@RequestParam String keyword) {
            return bookService.search(keyword);
        }
    }
    

Linux如何安装Elasticsearch

Linux安装Elasticsearch可以分为以下步骤:

  1. 安装Java:Elasticsearch需要Java运行环境,因此需要先安装Java。可以使用以下命令安装Java:

    apt-get update
    apt-get install openjdk-11-jre-headless
    
  2. 下载Elasticsearch:可以从Elasticsearch的官方网站下载Elasticsearch的压缩包,例如:

    wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.12.0-linux-x86_64.tar.gz
    
  3. 解压Elasticsearch:使用以下命令解压Elasticsearch:

    tar -xzf elasticsearch-7.12.0-linux-x86_64.tar.gz
    
  4. 配置Elasticsearch:在解压后的Elasticsearch目录中,打开config目录,修改elasticsearch.yml文件,可以设置集群名称、节点名称、监听地址等配置,例如:

    cluster.name: my-cluster
    node.name: my-node
    network.host: 0.0.0.0
    
  5. 启动Elasticsearch:使用以下命令启动Elasticsearch:

    cd elasticsearch-7.12.0/bin/
    ./elasticsearch
    
  6. 验证Elasticsearch:可以使用curl命令验证Elasticsearch是否正常运行,例如:

    curl http://localhost:9200/
    

    如果Elasticsearch正常运行,会返回类似以下的响应:

    {
      "name" : "my-node",
      "cluster_name" : "my-cluster",
      "cluster_uuid" : "7p4wv4J4T4CQ2JhV7M0JvQ",
      "version" : {
        "number" : "7.12.0",
        "build_flavor" : "default",
        "build_type" : "tar",
        "build_hash" : "78722783c38caa25a70982b5b042074cde5d3b3a",
        "build_date" : "2021-03-18T06:17:15.410153305Z",
        "build_snapshot" : false,
        "lucene_version" : "8.8.0",
        "minimum_wire_compatibility_version" : "6.8.0",
        "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    

文章作者:
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 !
  目录