Elasticsearch集群搭建、优化及实践

news2024/11/24 12:39:04

文章目录

  • 一、Elasticsearch集群
    • 1、Elasticsearch集群概念
    • 2、Elasticsearch集群安装
    • 3、安装Kibana
    • 4、测试集群状态
  • 二、Elasticsearch优化
    • 1、磁盘选择
    • 2、分片策略
    • 3、内存设置
  • 三、Elasticsearch实践
    • 1、ES自动补全
    • 2、创建索引
    • 3、安装logstash导入数据
    • 4、项目搭建
    • 5、自动补全功能
    • 6、高亮搜索关键字功能
    • 7、页面展示
  • 总结:

一、Elasticsearch集群

1、Elasticsearch集群概念

  1. 当索引足够大时,需要建立ES集群,此时需要将索引拆分成多分,分别放入不同的服务器中,几台服务器维护同一个索引。每一台服务器为一个节点,每一台服务器中的数据称为一个分片。
  2. 如果某个节点故障,则会造成集群崩溃,所以每个节点的分片往往还会创建副本,存放在其他节点中,此时一个节点崩溃就不会影响整个集群的正常运行了。即分片和该分片的副本不会存放在同一个节点上。
  3. 1)节点(node):一个节点是集群中的一台服务器,是集群的一部分。它存储数据,参与集群的索引和搜索功能。集群中有一个主节点,主节点通过ES集群内部选举产生。
    2)集群(cluster):一组节点组织在一起称为一个集群,它们共同持有整个的数据,并一起提供索引和搜索功能。
    3)分片(shards):ES可以把完整的索引分成多个分片,分别存储在不同的节点上。
    4)副本(replicas):ES可以为每个分片创建副本,提高查询效率,保证在分片数据丢失后的恢复。
    分片数量只能在索引创建时指定,索引创建后不能再更改分片数量,但可以改变副本的数量。

2、Elasticsearch集群安装

  1. 下载Elasticsearch7.17.7版本:https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.7-linux-x86_64.tar.gz
    因为8.6.2版本,与springboot整合ES的版本不一致无法解析响应正文,而且7.17.7也是比较新的

  2. 将该压缩包通过Mobax终端上传到目录/中,进入到目录/中,然后解压到目录/usr/local/中:tar -zxvf elasticsearch-7.17.7-linux-x86_64.tar.gz -C /usr/local/

  3. 安装ik分词器到该ES服务中:
    1)下载IKAnalyzer:https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.17.7/elasticsearch-analysis-ik-7.17.7.zip
    2)通过mobax上传至虚拟机的目录/,进入到目录/中,然后进行解压缩:unzip elasticsearch-analysis-ik-7.17.7.zip -d /usr/local/elasticsearch-7.17.7/plugins/analysis-ik

  4. 安装拼音分词器到该ES服务中:
    1)下载拼音分词器:https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v7.17.7/elasticsearch-analysis-pinyin-7.17.7.zip
    2)通过mobax上传到虚拟机的/目录,进入到目录/中,解压到elasticsearch的plugins/analysis-pinyin目录下:unzip elasticsearch-analysis-pinyin-7.17.7.zip -d /usr/local/elasticsearch-7.17.7/plugins/analysis-pinyin

  5. 给es用取得该文件件的权限:chown -R es:es /usr/local/elasticsearch-7.17.7

  6. 修改配置文件:vim /usr/local/elasticsearch-7.17.7/config/elasticsearch.yml,添加如下

    #集群名称,保证唯一
    cluster.name: my_elasticsearch
    #节点名称,必须不一样
    node.name: node1
    #可以访问该节点的ip地址
    network.host: 0.0.0.0
    #该节点服务端口号
    http.port: 9200
    #集群间通信端口号
    transport.tcp.port: 9300
    #候选主节点的设备地址
    discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
    #候选主节点的节点名
    cluster.initial_master_nodes: ["node1","node2","node3"]
    #关闭安全认证,才能访问es
    xpack.security.enabled: false
    xpack.security.http.ssl:
    			   enabled: false
    
  7. 将elasticsearch-7.17.7文件夹修改名字为myes1:mv /usr/local/elasticsearch-7.17.7/ /usr/local/myes1

  8. 切换为es用户:su es

  9. 后台启动第一个ES节点:ES_JAVA_OPTS="-Xms512m -Xmx512m" /usr/local/myes1/bin/elasticsearch -d,默认占用4G,只是为了搭建集群而搭建集群,所以设置512m的内存。

  10. 测试ES服务是否正常启动:curl 127.0.0.1:9200

  11. 切换为root用户:su root

  12. 进入到目录/中,然后将ES压缩包解压到目录/usr/local/中:tar -zxvf elasticsearch-7.17.7-linux-x86_64.tar.gz -C /usr/local/

  13. 进入到目录/中,然后将ik分词器压缩包进行解压缩:unzip elasticsearch-analysis-ik-7.17.7.zip -d /usr/local/elasticsearch-7.17.7/plugins/analysis-ik

  14. 进入到目录/中,然后将pinyin分词器解压到elasticsearch的plugins/analysis-pinyin目录下:unzip elasticsearch-analysis-pinyin-7.17.7.zip -d /usr/local/elasticsearch-7.17.7/plugins/analysis-pinyin

  15. 给es用取得该文件件的权限:chown -R es:es /usr/local/elasticsearch-7.17.7

  16. 修改配置文件:vim /usr/local/elasticsearch-7.17.7/config/elasticsearch.yml,添加如下

    #集群名称,保证唯一
    cluster.name: my_elasticsearch
    #节点名称,必须不一样
    node.name: node2
    #可以访问该节点的ip地址
    network.host: 0.0.0.0
    #该节点服务端口号
    http.port: 9201
    #集群间通信端口号
    transport.tcp.port: 9301
    #候选主节点的设备地址
    discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
    #候选主节点的节点名
    cluster.initial_master_nodes: ["node1","node2","node3"]
    #关闭安全认证,才能访问es
    xpack.security.enabled: false
    xpack.security.http.ssl:
    			   enabled: false
    
  17. 将elasticsearch-7.17.7文件夹修改名字为myes2:mv /usr/local/elasticsearch-7.17.7/ /usr/local/myes2

  18. 进入到目录/中,然后将ES压缩包解压到目录/usr/local/中:tar -zxvf elasticsearch-7.17.7-linux-x86_64.tar.gz -C /usr/local/

  19. 进入到目录/中,然后将ik分词器压缩包进行解压缩:unzip elasticsearch-analysis-ik-7.17.7.zip -d /usr/local/elasticsearch-7.17.7/plugins/analysis-ik

  20. 进入到目录/中,然后将pinyin分词器解压到elasticsearch的plugins/analysis-pinyin目录下:unzip elasticsearch-analysis-pinyin-7.17.7.zip -d /usr/local/elasticsearch-7.17.7/plugins/analysis-pinyin

  21. 给es用取得该文件件的权限:chown -R es:es /usr/local/elasticsearch-7.17.7

  22. 修改配置文件:vim /usr/local/elasticsearch-7.17.7/config/elasticsearch.yml,添加如下

    #集群名称,保证唯一
    cluster.name: my_elasticsearch
    #节点名称,必须不一样
    node.name: node3
    #可以访问该节点的ip地址
    network.host: 0.0.0.0
    #该节点服务端口号
    http.port: 9202
    #集群间通信端口号
    transport.tcp.port: 9302
    #候选主节点的设备地址
    discovery.seed_hosts: ["127.0.0.1:9300","127.0.0.1:9301","127.0.0.1:9302"]
    #候选主节点的节点名
    cluster.initial_master_nodes: ["node1","node2","node3"]
    #关闭安全认证,才能访问es
    xpack.security.enabled: false
    xpack.security.http.ssl:
    			   enabled: false
    
  23. 将elasticsearch-7.17.7文件夹修改名字为myes3:mv /usr/local/elasticsearch-7.17.7/ /usr/local/myes3

  24. 切换为es用户:su es

  25. 后台启动第二个ES节点:ES_JAVA_OPTS="-Xms512m -Xmx512m" /usr/local/myes2/bin/elasticsearch -d

  26. 后台启动第三个ES节点:ES_JAVA_OPTS="-Xms512m -Xmx512m" /usr/local/myes3/bin/elasticsearch -d

  27. 查看集群是否搭建成功,访问浏览器:http://192.168.126.24:9200/_cat/nodes

  28. 查看集群的状态:curl -uelastic:pwd -XGET "http://127.0.0.1:9200/_cluster/health?pretty"

3、安装Kibana

  1. 在Elasticsearch官网下载linux版的kibana:https://artifacts.elastic.co/downloads/kibana/kibana-7.17.7-linux-x86_64.tar.gz
  2. 切换到root用户:su root
  3. 在目录/中上传该压缩包,然后在目录/下解压缩到目录/usr/local/中:tar -zxvf kibana-7.17.7-linux-x86_64.tar.gz -C /usr/local/
  4. 修改配置文件
    1)进入到config目录下:cd /usr/local/kibana-7.17.7-linux-x86_64/config
    2)修改配置文件:vim kibana.yml
    3)添加kibana主机ip:server.host: "192.168.126.24"
    添加Elasticsearch路径:elasticsearch.hosts: ["http://127.0.0.1:9200","http://127.0.0.1:9201","http://127.0.0.1:9202"]
  5. 给es用户设置kibana目录权限:chown -R es:es /usr/local/kibana-7.17.7-linux-x86_64/
  6. 切换到es用户:su es
  7. 确保启动Elasticsearch后,再启动kibana:/usr/local/kibana-7.17.7-linux-x86_64/bin/kibana
  8. 在浏览器中访问kibana:http://192.168.126.24:5601/

4、测试集群状态

  1. 创建product索引

    PUT /product
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1
      },
      "mappings": {
        "properties": {
          "id": {
            "type": "integer",
            "store": true,
            "index": true
          },
          "productName": {
            "type": "text",
            "store": true,
            "index": true
          },
          "productDesc": {
            "type": "text",
            "store": true,
            "index": true
          }
        }
      }
    }
    
    

    “number_of_shards”: 5,即设置该索引的分片数量为5,“number_of_replicas”: 1,每个分片的副本数为1。

  2. 查看集群健康状态:GET /_cat/health?v

  3. 查看索引状态:GET /_cat/indices?v

  4. 查看分片状态:GET /_cat/shards?v

  5. ES集群可以自动进行故障应对,即可以自动进行水平扩容。

  6. 改变每个分片的副本数

    PUT /product/_settings
    {
      "number_of_replicas": 2
    }
    
    

    分片数不能改变,但是分片的副本数可以改变。

二、Elasticsearch优化

1、磁盘选择

  1. Elasticsearch重度使用磁盘,磁盘的效率越高,Elasticsearch的执行效率就越高。
  2. 优化磁盘:
    1)使用SSD(固态硬盘)。
    2)使用RAID0模式,即将连续的数据分散到多个硬盘存储,这样可以并行进行IO操作。代价是一块硬盘发生故障就会引发系统故障。
    3)不要使用远程挂载的存储。即在ES服务器中,而非ES服务器之外的存储。

2、分片策略

  1. 每个分片的底层都是一个Lucene索引,会消耗一定的系统资源。搜索请求需要命中索引中的所有分片,分片过多会降低搜索的性能。

  2. 分片原则:
    1)每个分片占用的磁盘容量不超过ES的JVM的最大堆空间设置(一般设置不超过32G)。
    2)分片数一般不超过节点数的三倍。
    3)推迟分片分配:节点中断后集群会重新分配分片。但默认集群会等待一分钟来查看节点是否重新加入。可以设置等待的时长,减少分配的次数。

    PUT /product/_settings
    {
      "settings":{
        "index.unassigned.node_left.delayed_timeout": "5m"
       }
    }
    
    
  1. 减少副本数量:进行写入操作时,需要把写入的数据都同步到副本中,副本越多写入的效率就越慢。进行大批量写入操作时可以先设置副本数为0,写入完成后再修改回正常的状态。

3、内存设置

  1. ES默认占用内存时4G,可以修改config/jvm.option文件设置ES的堆内存大小。
  2. 1)Xms表示堆内存的初始大小,Xmx表示可分配的最大内存。
    2)Xmx和Xms的大小设置为相同时,可以减轻伸缩堆大小带来的压力。
    3)Xmx和Xms不要超过物理内存的50%,因为ES内部的Lucene也要占据一部分物理内存。
    4)Xmx和Xms不要超过32G,由于JAVA语言的特性,堆内存超过32G会浪费大量系统资源,所以在内存足够的情况下,最终都会采用设置为31G。

三、Elasticsearch实践

1、ES自动补全

  1. 自动补全对性能要求极高,ES不是通过倒排索引来实现的,所以需要将对应的查询字段类型设置为completion。

  2. 创建索引,添加自动补全字段

    PUT /product2
    {
      "mappings": {
        "properties": {
          "id": {
            "type": "integer",
            "store": true,
            "index": true
          },
          "productName": {
            "type": "completion",
            "store": true,
            "index": true
          },
          "productDesc": {
            "type": "text",
            "store": true,
            "index": true
          }
        }
      }
    }
    POST /product2/_doc
    {
      "id":1,
      "productName":"elasticsearch1",
      "productDesc":"elasticsearch1 is a good search engine"
    }
    POST /product2/_doc
    {
      "id":2,
      "productName":"elasticsearch2",
      "productDesc":"elasticsearch2 is a good search engine"
    }
    
  3. 测试自动补全功能

    GET /product2/_search
    {
      "suggest": {
        "prefix_suggestion": {
          "prefix": "elastic",
          "completion": {
            "field": "productName",
            "skip_duplicates": true,
            "size": 10 
           }
         }
       }
    }
    

2、创建索引

  1. 创建news索引

    PUT /news
    {
      "settings": {
        "number_of_shards": 5,
        "number_of_replicas": 1,
        "analysis": {
          "analyzer": {
            "ik_pinyin": {
              "tokenizer": "ik_smart",
              "filter": "pinyin_filter"
            },
            "tag_pinyin": {
              "tokenizer": "keyword",
              "filter": "pinyin_filter"
            }
          },
          "filter": {
            "pinyin_filter": {
              "type": "pinyin",
              "keep_joined_full_pinyin":true,
              "keep_original": true,
              "remove_duplicated_term": true
            }
          }
        }
      },
      "mappings": {
        "properties": {
          "id": {
            "type": "integer",
            "index": true
          },
          "title": {
            "type": "text",
            "index": true,
            "analyzer": "ik_pinyin",
            "search_analyzer": "ik_smart"
          },
          "content": {
            "type": "text",
            "index": true,
            "analyzer": "ik_pinyin",
            "search_analyzer": "ik_smart"
          },
          "url": {
            "type": "keyword",
            "index": true
          },
          "tags": {
            "type": "completion",
            "analyzer": "tag_pinyin"
          }
        }
      }
    }
    

3、安装logstash导入数据

  1. 通过命令行进入mysql中导入SQL文件:source 绝对路径/xxx.sql;

  2. 下载logstash:https://artifacts.elastic.co/downloads/logstash/logstash-7.17.7-windows-x86_64.zip

  3. 将logstash压缩包进行解压,在/logstash-7.17.7/config/目中下创建mysql.conf文件。写入以下脚本:

    input {
       jdbc {
         jdbc_driver_library => "F:\SoftWare\mysql\mysql-connector-java-8.0.27.jar"
         jdbc_driver_class => "com.mysql.jdbc.Driver"
         jdbc_connection_string => "jdbc:mysql:///news"
         jdbc_user => "root"
         jdbc_password => "root"
         schedule => "* * * * *"
         jdbc_default_timezone => "Asia/Shanghai"
         statement => "SELECT * FROM news;"
       }
    }
    
    filter {
        mutate {
            split => {"tags" => ","}
        }
    }
    
    output {
       elasticsearch {
            hosts => ["192.168.126.24:9200","192.168.126.24:9201","192.168.126.24:9202"]
         index => "news"
         document_id => "%{id}"
       }
    }
    
  4. 在解压路径/logstash-7.17.7下,打开cmd窗口,运行命令:bin\logstash -f config\mysql.conf

  5. 测试自动补齐功能

    GET /news/_search
    {
      "suggest": {
        "YOUR_SUGGESTION": {
          "prefix": "zhu", //需要补全的关键词
          "completion": {
            "field": "tags",
            "skip_duplicates": true,//去重复值
            "size": 10
          }
        }
      }
    }
    

4、项目搭建

  1. 在myes空项目中,新建一个module,选择2.7.9版本的springboot项目,并且添加lombok,springweb,springdataES依赖

在这里插入图片描述](https://img-blog.csdnimg.cn/ad1a6e1230c7454ead25d0c787cdaed2.png)

  1. 在resources目录下,创建配置文件application.yml,添加如下配置:

    spring:
      elasticsearch:
        uris: http://192.168.126.24:9200,http://192.168.126.24:9201,http://192.168.126.24:9202
    
    logging:
      pattern:
        console: '%d{HH:mm:ss.SSS} %clr(%-5level) ---  [%-15thread] %cyan(%-50logger{50}):%msg%n'
    
  2. 创建com.zzx.escase.document包,在包下创建实体类News

    package com.zzx.escase.document;
    
    import lombok.Data;
    import org.springframework.data.annotation.Id;
    import org.springframework.data.annotation.Transient;
    import org.springframework.data.elasticsearch.annotations.CompletionField;
    import org.springframework.data.elasticsearch.annotations.Document;
    import org.springframework.data.elasticsearch.annotations.Field;
    import org.springframework.data.elasticsearch.core.suggest.Completion;
    
    @Document(indexName = "news")
    @Data
    public class News {
        @Id
        private Integer id;
        @Field
        private String title;
        @Field
        private String content;
        @Field
        private String url;
        @CompletionField
        @Transient
        private Completion tags;
    }
    
    
  3. 创建com.zzx.escase.repository包,在包下创建接口Repository

    package com.zzx.escase.repository;
    
    import com.zzx.escase.document.News;
    import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
    
    public interface NewsRepository extends ElasticsearchRepository<News,Integer> {
    }
    
    

5、自动补全功能

  1. 创建com.zzx.escase.service包,在包下创建类NewsService

    package com.zzx.escase.service;
    
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.common.text.Text;
    import org.elasticsearch.search.suggest.Suggest;
    import org.elasticsearch.search.suggest.SuggestBuilder;
    import org.elasticsearch.search.suggest.SuggestBuilders;
    import org.elasticsearch.search.suggest.completion.CompletionSuggestionBuilder;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
    import org.springframework.data.elasticsearch.core.mapping.IndexCoordinates;
    import org.springframework.stereotype.Service;
    
    import java.util.List;
    import java.util.stream.Collectors;
    
    @Service
    public class NewsService {
        @Autowired
        private ElasticsearchRestTemplate template;
        //自动补齐
        public List<String> autoSuggest(String keyword){
            // 1.创建补齐请求
            SuggestBuilder suggestBuilder = new SuggestBuilder();
            // 2.构建补齐条件
            CompletionSuggestionBuilder suggestionBuilder = SuggestBuilders.completionSuggestion("tags").prefix(keyword).skipDuplicates(true).size(10);
            suggestBuilder.addSuggestion("prefix_suggestion",suggestionBuilder);
            // 3.发送请求
            SearchResponse response = template.suggest(suggestBuilder, IndexCoordinates.of("news"));
            // 4.处理结果
            List<String> result = response.getSuggest().getSuggestion("prefix_suggestion").getEntries().get(0).getOptions().stream()
                    .map(Suggest.Suggestion.Entry.Option::getText)
                    .map(Text::toString)
                    .collect(Collectors.toList());
            return result;
        }
    }
    
    
  2. 在Test根目录下,创建com.zzx.escase.service包,在包下创建NewsServiceTest测试类

    package com.zzx.escase.service;
    
    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    
    import java.util.List;
    
    @SpringBootTest
    public class NewsServiceTest {
        @Autowired
        private NewsService newsService;
        @Test
        public void testAutoSuggest(){
            List<String> list = newsService.autoSuggest("zhu");
            list.forEach(System.out::println);
        }
    
    }
    
    

    即打印出tags域中自动补齐的10个关键词

6、高亮搜索关键字功能

  1. 在com.zzx.escase.repository的接口Repository下,添加高亮搜索关键字方法

    @Highlight(fields = {@HighlightField(name = "title"),@HighlightField(name="content")})
    List<SearchHit<News>> findByTitleMatchesOrContentMatches(String title, String content);
    
  2. 在com.zzx.escase.service的接口NewsService下,添加高亮搜索关键字方法

    //查询关键字
    public List<News> highLightSearch(String keyword){
        List<SearchHit<News>> result = newsRepository.findByTitleMatchesOrContentMatches(keyword, keyword);
        //处理结果,封装News类型的集合
        ArrayList<News> newsList = new ArrayList();
        for (SearchHit<News> newsSearchHit : result) {
            News news = newsSearchHit.getContent();
            //高亮字段
            Map<String, List<String>> highlightFields = newsSearchHit.getHighlightFields();
            if(highlightFields.get("title") != null){
                news.setTitle(highlightFields.get("title").get(0));
            }
            if(highlightFields.get("content") != null){
                news.setTitle(highlightFields.get("content").get(0));
            }
            newsList.add(news);
        }
        return  newsList;
    }
    

    将elasticsearch内部的处理高亮的结果封装到News实体类中,然后返回

  3. 在Test根目录下的com.zzx.escase.service包的NewsServiceTest测试类中添加高亮测试方法

    @Test
    public void testHighLightSearch(){
        List<News> newsList = newsService.highLightSearch("演员");
        newsList.forEach(System.out::println);
    }
    

    此时每个演员的关键字都会被套上em的标签,再由前端对em标签进行渲染。

  4. 创建com.zzx.escase.controller包,在包下创建类NewsController

    package com.zzx.escase.controller;
    
    import com.zzx.escase.document.News;
    import com.zzx.escase.service.NewsService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import java.util.List;
    
    @RestController
    public class NewsController {
        @Autowired
        private NewsService newsService;
        @GetMapping("/autoSuggest")
        public List<String> autoSuggest(String term){
            return newsService.autoSuggest(term);
        }
        @GetMapping("/highLightSearch")
        public List<News> highLightSearch(String term){
            return newsService.highLightSearch(term);
        }
    }
    
    
  5. 启动该springboot项目,然后在浏览器中查看:http://localhost:8080/autoSuggest?term="zhu"
    以及http://localhost:8080/highLightSearch?term="演员"

7、页面展示

  1. 前端页面代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>结果</title>
        <link rel="stylesheet" type="text/css" href="css/jquery-ui.min.css"/>
        <link rel="stylesheet" type="text/css" href="css/bootstrap.min.css"/>
        <script src="js/jquery-2.1.1.min.js"></script>
        <script src="js/jquery-ui.min.js"></script>
        <style>
            body {
                padding-left: 14px;
                padding-top: 14px;
            }
    
            ul, li {
                list-style: none;
                padding: 0;
            }
    
            li {
                padding-bottom: 16px;
            }
    
            a, a:link, a:visited, a:hover, a:active {
                text-decoration: none;
            }
    
            em {
                color: red;
                font-style: normal;
            }
        </style>
    </head>
    <body>
    <div>
        <input id="newsTag" class="form-control" style="display: inline; width: 50%;" name="keyword">
        <button class="btn btn-primary" onclick="search()">搜索一下</button>
    </div>
    <hr>
    <div>
        <ul id="news">
    
        </ul>
    </div>
    </body>
    <script>
        $("#newsTag").autocomplete({
            source: "/autoSuggest", // 请求路径
            delay: 100, //请求延迟
            minLength: 1 //最少输入多少字符像服务器发送请求
        })
    
        function search() {
            var term = $("#newsTag").val();
    
            $.get("/highLightSearch", {term: term}, function (data) {
                var str = "";
                for (var i = 0; i < data.length; i++) {
                    var document = data[i];
                    str += "<li>" +
                        "       <h4>" +
                        "           <a href='" + document.url + "' target='_blank'>" + document.title + "</a>" +
                        "       </h4> " +
                        "       <p>" + document.content + "</p>" +
                        "   </li>";
                }
                $("#news").html(str);
            })
    
        }
    </script>
    </html>
    

    给输入文本框绑定自动补齐autocomplete函数,以及给搜索按钮绑定search函数,用以展示数据。
    在这里插入图片描述

在这里插入图片描述

总结:

  1. 当索引足够大时,需要建立ES集群,此时需要将索引拆分成多分,分别放入不同的服务器中,几台服务器维护同一个索引。每一台服务器为一个节点,每一台服务器中的数据称为一个分片。防止节点故障导致集群无法正常运行,分片和该分片的副本不会存放在同一个节点上。
  2. 安装完ES服务后,再安装分词器,然后修改ES的配置文件elasticsearch.yml,配置成集群的参数即可完成集群的搭建。
    安装Kibana需要修改Kibana的配置文件kiabana.yml,配置集群的连接即可。
    在创建索引时,可以指定索引的分片数和分片的副本数,创建后只能修改分片的副本数。
  3. ES优化可以通过优化磁盘、分片策略、内存设置进行优化。
    1)优化磁盘,就是选择SSD或者使用RAID0模式;
    2)分片策略,就是每个分片占用的磁盘容量一般不超过32G。
    分片数一般不超过节点数的三倍。
    推迟分片分配。
    减少副本数量,以及大批量写入时,副本先设置为0,写完再复原。
    3)内存设置,就是Xmx和Xms的大小设置为相同。
    Xmx和Xms不要超过物理内存的50%。
    Xmx和Xms不要超过32G。
  4. 自动补全功能,指定的某个域作为源数据,因为该功能对性能要求极高,所以需要设置该域的类型为completion。在mysql数据库中的数据可以通过logstash导入到ES服务中。
  5. 搭建springboot整合的Elasticserach项目时,需要配置application.yml配置文件来指定集群。并且使用SuggestBuilder对象。
  6. 给搜索框绑定autocomplete函数,用以实现自动补齐功能;以及给搜索按钮绑定search函数,用以展示有高亮显示关键词的数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/392636.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nginx七大核心应用场景详解 解决生产中的实际问题 二次开发扩展

nginx七大核心应用场景详解 & 解决生产中的实际问题1、nginx的安装与简单配置1.1、环境准备1.2、nginx基本操作指令&#xff1a;1.3、安装成系统服务1.4、conf 配置文件说明2、虚拟主机2.1、nginx多主机配置2.2、二级域名与短网址解析3、基于反向代理的负载均衡3.1、跳转到…

【Mysql索引】五种索引类型

目录前期准备实操实战主键索引 primary唯一索引 unique执行效果普通索引 noraml执行效果全文索引 fulltext执行效果组合索引执行效果前期准备 创建一个表&#xff0c;如果有测试的表也可以用&#xff08;把主键id设置为自增&#xff09;如果给字段添加的值有中文&#xff0c;需…

vercel和netlify部署代码并解决接口代理转发的问题(和Nginx功能一样)

前言 部署过程就不说了,部署完成后是这样子的 然后访问链接,无法访问 解决 依次点击 Settings–>Domains&#xff0c;在输入框中输入你的域名并点击 Add 按钮。 以此域名为例子demo.gshopfront.dreamlove.top为例,点击添加 我们前往域名管理系统,记录下绿色的值以腾讯云的…

Android Surface 分析+源码

Surface的创建涉及三个部分&#xff1a; App 进程 App需要将自己的内容显示在屏幕上&#xff0c;所以App负责发起Surface创建请求&#xff0c;创建好Surface后, 就可以直接可以在canvas上画图等&#xff0c;最终都会保存到Surface里的buffer里&#xff0c;最后由SurfaceFlinge…

使用docker搭建WordPress博客

文章目录一、前置条件二、拉取镜像三、安装工具及依赖1.安装2.升级pip3.获取docker-compose方法一另一种方法&#xff08;推荐&#xff09;四、创建容器&#xff0c;启用镜像&#xff0c;映射端口五、访问并设置一、前置条件 主机&#xff1a;20.0.0.142 安装docker docker的安…

SQL-刷题技巧-删除重复记录

一. 原题呈现 牛客 SQL236. 删除emp_no重复的记录&#xff0c;只保留最小的id对应的记录。 描述&#xff1a; 删除emp_no重复的记录&#xff0c;只保留最小的id对应的记录。 drop table if exists titles_test; CREATE TABLE titles_test (id int(11) not null primary key…

Matlab论文插图绘制模板第80期—羽状图(Feather)

在之前的文章中&#xff0c;分享了很多Matlab线图的绘制模板&#xff1a; 进一步&#xff0c;再来分享一种特殊的线图&#xff1a;羽状图。 先来看一下成品效果&#xff1a; 特别提示&#xff1a;Matlab论文插图绘制模板系列&#xff0c;旨在降低大家使用Matlab进行科研绘图的…

2.2 分治法的基本思想

分治法的基本思想是将一个规模为n的问题分解为化个规模较小的子问题&#xff0c;这些子问题互相独立且与原问题相同。递归地解这些子问题&#xff0c;然后将各子问题的解合并得到原问题的解。它的一般的算法设计模式如下&#xff1a;divide-and-conquer(P) { if ( P < no) a…

SRS4.0 源码分析- RTC模块相关类

前言 本文介绍SRS4.0涉及RTC模块的C类&#xff0c;主要包括RTC Server和Session相关的。 SrsGoApiRtcPlay 处理webrtc client的播放请求&#xff0c;解析client的offer&#xff0c;并且生成server的answer&#xff0c;并且为这次请求创建一个session。SrsRtcServer 监听udp端…

如何实现沉浸式旅游与非物质文化遗产的共同发展

中国非物质文化遗产资源丰富&#xff0c;是世界上非物质文化遗产数量最多的国家。丰富多样的资源为非物质文化遗产旅游业的建设提供了良好的基础。非物质文化遗产旅游是基于非物质文化遗产资源开发的文化旅游消费形式。文化资源包括各民族代代相传的传统文化表现形式。非物质文…

【面试题】Vue面试题整理

1. v-show 和 v-if 的区别&#xff1f; v-if 指令用于条件渲染&#xff0c;它会根据表达式的值的真假来决定是否渲染元素。如果表达式的值为 false&#xff0c;则该元素不会被渲染并且也不会保留在 DOM 中。v-show 指令用于条件展示&#xff0c;它不会从 DOM 中删除元素&#…

Windows openssl-1.1.1d vs2017编译

工具&#xff1a; 1. perl&#xff08;https://strawberryperl.com/&#xff09; 2. nasm&#xff08;https://nasm.us/&#xff09; 3. openssl源码&#xff08;https://www.openssl.org/&#xff09; 可以自己去下载 或者我的网盘提供下载&#xff1a; 链接&#xff1a;…

Redis List 底层三种数据结构原理剖析

1. Redis List 是什么作为 Java 开发者的你&#xff0c;看到这个词并不陌生。在 Java 开发中几乎每天都会使用这个数据结构。Redis 的 List 与 Java 中的 LinkedList 类似&#xff0c;是一种线性的有序结构&#xff0c;可以按照元素被推入列表中的顺序来存储元素&#xff0c;能…

2023年第九周总周结 | 开学第一周

为什么要做周总结&#xff1f; 1.避免跳相似的坑 2.客观了解上周学习进度并反思&#xff0c;制定可完成的下周规划 一、上周问题解决情况 不满却又喜欢“受害者”身份项目导向学习进展困难&#xff0c;进而产生挫败焦虑作息调整→学习时长变少and变碎 二、这周存在问题 and 反…

Tomcat 配置文件数据库密码加密

几年前研究过Tomcat context.xml 中数据库密码改为密文的内容&#xff0c;因为当时在客户云桌面代码没有留备份也没有文章记录&#xff0c;最近项目又提出了这个需求就又重新拾起来学习一下。在网上找了一些资料&#xff0c;自己也大概试了一下&#xff0c;目前功能是实现了。参…

SpringCloud系列(十五)[分布式搜索引擎篇] - 结合实际应用场景学习并使用 RestClient 客户端 API

前面的文章具体介绍了是索引库及文档的一些基本操作指令, 指令还是挺简单的; 那么实际应用场景下, 我们是如何操作 ElasticSearch 的呢?  其实 ElasticSearch 官方已经为我们提供了各种不同语言的客户端, 目的就是为了来操作 ElasticSearch, 这些客户端的本质就是组装 DSL 语…

vmware虚拟机与树莓派4B安装ubuntu1804 + ros遇到的问题

如题所示&#xff0c;本人在虚拟机上安装ubuntu1804&#xff0c;可以很容易安装&#xff0c;并且更换系统apt源和ros源&#xff0c;然后安装ros&#xff0c;非常顺利&#xff0c;但是在树莓派4B上安装raspiberry系统就遇到了好多问题。 树莓派我烧录的是这个镜像&#xff1a;ub…

ASO优化之选择最佳关键词

ASO的关键字排名是指针对特定的关键词在应用商店搜索结果中所形成的位置。虽然这看起来很简单&#xff0c;但应用商店排名不仅仅是位置&#xff0c;应用的排名统计数据都要考虑进去。 应用商店搜索结果因国家/地区而异&#xff0c;这就意味着如果我们从不同的国家或地区进行搜…

经典文献阅读之--Lifelong SLAM(变化环境中Lifelong定位建图)

0. 简介 商场、超市等大多数现实场景的环境随时都在变化。不考虑这些变化的预建地图很容易变得过时。因此&#xff0c;有必要拥有一个最新的环境模型&#xff0c;以促进机器人的长期运行。为此《A General Framework for Lifelong Localization and Mapping in Changing Envir…

Oracle技术分享 exp导数据时报错ORA-01578 ORA-01110

问题描述&#xff1a;exp导数据时报错ORA-01578 ORA-01110&#xff0c;如下所示&#xff1a; 数据库&#xff1a;oracle 19.12 多租户 1、异常重现 [oracledbserver ~]$ exp ora1/ora1orclpdbfileemp.dmp tablesemp logexp.log Export: Release 19.0.0.0.0 - Production onS…