ElasticSearch7安裝與SpringBoot集成

ElasticSearch7安裝

步驟

html

1.當前的版本是7.5.1,後面安裝的插件會依賴es的版本,也可根據須要指定版本java

2.es推薦安裝在docker中,爲演示方便,直接使用了windows版本node

  • 進入解壓目錄elasticsearch-7.5.1,進入bin目錄,雙擊elasticsearch.bat便可啓動

  • 驗證啓動成功,直接在瀏覽器訪問9200端口便可

  • 或者其餘工具訪問一下

經常使用指令

啓動成功後,經過postman就能夠向es執行操做命令mysql

1.添加或更新索引及其文檔git

方法一(推薦):PUT /{索引}/{文檔}/{id}, id爲必傳,若沒有該id則插入數據,已有id則更新數據(若只傳入索引,則建立索引)github

方法二:POST /{索引}/{文檔}/{id}, id可省略,如不傳則由es生成spring

2.獲取全部文檔sql

GET /{索引}/{文檔}/_searchdocker

如:http://127.0.0.1:9200/newindex/newdoc/_search數據庫

3.獲取指定id文檔

GET /{索引}/{文檔}/{id}

如:http://127.0.0.1:9200/newindex/newdoc/1

4.模糊查詢

GET /{索引}/{文檔}/_search?q=*關鍵詞*

如:http://127.0.0.1:9200/newindex/newdoc/_search?q=*王*

5.刪除文檔

DELETE /{索引}/{文檔}/{id}

如:http://127.0.0.1:9200/newindex/newdoc/1

更多語句可參考官網

可視化工具

  • 安裝ElasticSearch-Head,下載源碼
git clone https://github.com/mobz/elasticsearch-head.git
複製代碼
  • 全局安裝grunt項目構建工具
npm install -g grunt-cli
複製代碼
  • 安裝依賴
cd elasticsearch-head/
npm install
複製代碼
  • 修改elasticsearch配置文件
vim ../elasticsearch-7.5.1/config/elasticsearch.yml
複製代碼
  • 追加跨域訪問的配置,添加末尾便可
http.cors.enabled: true
http.cors.allow-origin: "*"
複製代碼

  • 啓動ElasticSearch-Head
cd -	// 返回head根目錄
grunt server
複製代碼
  • 瀏覽器訪問查看:localhost:9100

IK分詞器

下載

  1. github下載與或直接下載壓縮包,我選擇了第二種

  2. 解壓後,將解壓的文件夾拷貝到elasticsearch-7.5.1\plugins目錄下,文件夾重名爲ik

  3. 測試ik分詞器的中文效果

擴展自定義分詞器的內容

  1. 在\elasticsearch-7.5.1\plugins\ik\config目錄下新建custom.dic;

  2. 添加本身的自定義的詞彙;

  3. 修改同目錄下的IKAnalyzer.cfg.xml文件,爲<entry key="ext_dict">屬性指定自定義的詞典;

  1. 重啓elasticsearch,效果以下:

整合SpringBoot

準備

  • 添加依賴Spring Data ElasticSearch
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
複製代碼
  • 添加配置
spring:
 data:
 elasticsearch:
 cluster-nodes: 127.0.0.1:9300
複製代碼

代碼編寫

  • 新建實體類
@Data
@Accessors(chain = true)
@Document(indexName = "school", type = "student") // indexName爲ES索引名,type爲文檔名
public class Student implements Serializable {

    // id標識
    // index=true表明是否開啓索引,默認開啓;
    // type字段類型
    // analyzer="ik_max_word"表明搜索的時候是如何分詞匹配,爲IK分詞器最細顆粒度
    // searchAnalyzer = "ik_max_word"搜索分詞的類型
    @Id
    private String id;
    
    @Field(type = FieldType.Keyword, analyzer = "ik_max_word", searchAnalyzer = "ik_max_word")
    private String name;

    private Integer age;

    @Field(type = FieldType.Double)
    private Double score;

    @Field(type = FieldType.Text, analyzer = "ik_max_word")
    private String info;
}
複製代碼
  • 分頁實體
@Data
@Accessors(chain = true)
public class QueryPage {

    /** * 當前頁 */
    private Integer current;

    /** * 每頁記錄數 */
    private Integer size;
}
複製代碼
  • 數據持久層
public interface EsRepository extends ElasticsearchRepository<Student, String> {

    /** * 根據學生姓名或信息模糊查詢 */
    Page<Student> findByNameAndInfoLike(String name, String info, Pageable pageable);
}
複製代碼
  • 業務層接口及其實現
public interface EsService {

    /** * 插入 */
    void add(Student student);
    
    /** * 批量插入 */
    void addAll(List<Student> student);

    /** * 模糊查詢 */
    Page<Student> search(String keyword, QueryPage queryPage);
}
複製代碼
@Service
public class EsServiceImpl implements EsService {

    @Autowired
    private EsRepository esRepository;

    @Override
    public void add(Student student) {
        esRepository.save(student);
    }
    
    @Override
    public void addAll(List<Student> student) {
        esRepository.saveAll(student);
    }    

    @Override
    public Page<Student> search(String keyword, QueryPage queryPage) {
        // es默認索引從0開始,mp默認從1開始
        PageRequest pageRequest = PageRequest.of(queryPage.getCurrent() - 1, queryPage.getSize());
        return esRepository.findByNameOrInfoLike(keyword, keyword, pageRequest);
    }
}
複製代碼
  • 編寫測試類
@SpringBootTest
public class EsServiceImplTest {

    @Autowired
    private EsService esService;

    @Test
    public void insert() {
        List<Student> students = new ArrayList<>();
        for (int i = 10; i <= 12; i++) {
            Student student = new Student();
            student.setId(i + "").setAge(10 + i).setName("王二狗" + i).setScore(72.5 + i).setInfo("大王派我來巡山" + i);
            students.add(student);
        }
        esService.addAll(students);
    }

    @Test
    public void fuzzySearch() {
        QueryPage queryPage = new QueryPage();
        queryPage.setCurrent(1).setSize(5);
        Page<Student> list = esService.search("二狗2", queryPage);
        list.forEach(System.out::println);
    }
}
複製代碼

MySql數據導入ElasticSearch

安裝

配置

  • 解壓壓縮包
  • 拷貝\logstash-7.5.1\config\logstash-sample.conf在當前目錄,重命名爲logstash.conf
  • 修改成以下配置
# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  jdbc {
	# MySql鏈接配置
    jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/springboot_es?characterEncoding=UTF8"
    jdbc_user => "root"
    jdbc_password => "1234"
    jdbc_driver_library => "D:\Develop_Tools_Others\logstash-7.5.1\mysql-connector-java-5.1.26.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_paging_enabled => "true"
    jdbc_page_size => "50000"
    # SQL查詢語句,用於將查詢到的數據導入到ElasticSearch
    statement => "select id,name,age,score,info from t_student"
    # 定時任務,各自表示:分 時 天 月 年 。所有爲 * 默認每分鐘執行
    schedule => "* * * * *"
  }
}
output {
  elasticsearch {
    hosts => "localhost:9200"
    # 索引名稱
    index => "school"
	# 文檔名稱
    document_type => "student"
    # 自增ID編號
    document_id => "%{id}"
  }
  stdout {
    # JSON格式輸出
    codec => json_lines
  }
}
複製代碼
  • 建立數據庫springboot_es ,導入數據庫腳本
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for t_student
-- ----------------------------
DROP TABLE IF EXISTS `t_student`;
CREATE TABLE `t_student`  (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '學生姓名',
  `age` int(11) NULL DEFAULT NULL COMMENT '年齡',
  `score` double(255, 0) NULL DEFAULT NULL COMMENT '成績',
  `info` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '信息',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of t_student
-- ----------------------------
INSERT INTO `t_student` VALUES (1, '小明', 18, 88, '好好學習');
INSERT INTO `t_student` VALUES (2, '小紅', 17, 85, '每天向上');
INSERT INTO `t_student` VALUES (3, '王二狗', 30, 59, '無產階級');

SET FOREIGN_KEY_CHECKS = 1;
複製代碼

運行

  • 先啓動ES,再啓動Es-head
  • 最後啓動logstash,啓動命令爲:
D:\Develop_Tools_Others\logstash-7.5.1>.\bin\logstash.bat -f .\config\logstash.conf
複製代碼
  • 訪問localhost:9600,查看啓動成功

  • 查看控制檯,是否同步數據

  • 最後可產看es-head,查看同步的數據

相關文章
相關標籤/搜索