SpringBoot Elasticsearch6.8.5

es目錄.png

Windwos Elasticsearch

Elasticsearch 基本介紹

全文搜索屬于最常見的需求,開源的 Elasticsearch (以下簡(jiǎn)稱 Elastic)是目前全文搜索引擎的首選。

Elasticsearch是一個(gè)開源的分布式、RESTful 風(fēng)格的搜索和數(shù)據(jù)分析引擎,它的底層是開源庫Apache Lucene。
?Lucene 可以說是當(dāng)下最先進(jìn)、高性能、全功能的搜索引擎庫——無論是開源還是私有,但它也僅僅只是一個(gè)庫。為了充分發(fā)揮其功能,你需要使用 Java 并將 Lucene 直接集成到應(yīng)用程序中。 更糟糕的是,您可能需要獲得信息檢索學(xué)位才能了解其工作原理,因?yàn)長(zhǎng)ucene 非常復(fù)雜。

Elastic 的底層是開源庫 Lucene。但是,你沒法直接用 Lucene,必須自己寫代碼去調(diào)用它的接口。Elastic 是 Lucene 的封裝,提供了 REST API 的操作接口,開箱即用。

為了解決Lucene使用時(shí)的繁復(fù)性,于是Elasticsearch便應(yīng)運(yùn)而生。它使用 Java 編寫,內(nèi)部采用 Lucene 做索引與搜索,但是它的目標(biāo)是使全文檢索變得更簡(jiǎn)單,簡(jiǎn)單來說,就是對(duì)Lucene 做了一層封裝,它提供了一套簡(jiǎn)單一致的 RESTful API 來幫助我們實(shí)現(xiàn)存儲(chǔ)和檢索。
?當(dāng)然,Elasticsearch 不僅僅是 Lucene,并且也不僅僅只是一個(gè)全文搜索引擎。 它可以被下面這樣準(zhǔn)確地形容:

  • 一個(gè)分布式的實(shí)時(shí)文檔存儲(chǔ),每個(gè)字段可以被索引與搜索
  • 一個(gè)分布式實(shí)時(shí)分析搜索引擎
  • 能勝任上百個(gè)服務(wù)節(jié)點(diǎn)的擴(kuò)展,并支持 PB 級(jí)別的結(jié)構(gòu)化或者非結(jié)構(gòu)化數(shù)據(jù)
  • 可以快速地儲(chǔ)存、搜索和分析海量數(shù)據(jù)

由于Elasticsearch的功能強(qiáng)大和使用簡(jiǎn)單,維基百科、衛(wèi)報(bào)、Stack Overflow、GitHub等都紛紛采用它來做搜索。現(xiàn)在,Elasticsearch已成為全文搜索領(lǐng)域的主流軟件之一。

Elastic 是java寫的,需要 Java 的jdk環(huán)境,根據(jù)下方【版本手冊(cè)】查看對(duì)應(yīng)jdk版本。

推薦華為鏡像快速下載https://mirrors.huaweicloud.com/elasticsearch/

官方選擇下載https://www.elastic.co/cn/downloads/past-releases/#elasticsearch

所有版本手冊(cè)https://www.elastic.co/guide/en/elasticsearch/reference/index.html

客戶端https://www.elastic.co/guide/en/elasticsearch/client/index.html

Elasticsearch 6.8.5 單機(jī)安裝

環(huán)境要求:jdk1.8(最低)、Elasticsearch 6.8.5

系統(tǒng):Windwows

下載:elasticsearch-6.8.5.zip , 參考手冊(cè)-6.8

安裝:解壓,找到bin\elasticsearch.bat,雙擊運(yùn)行

訪問:http://127.0.0.1:9200/

{
  "name" : "i1_C38J",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "_YG2A3LpSoOdh-wdLPOzlA",
  "version" : {
    "number" : "6.8.5",
    "build_flavor" : "default",
    "build_type" : "zip",
    "build_hash" : "78990e9",
    "build_date" : "2019-11-13T20:04:24.100411Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.2",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

以上顯示效果說明已經(jīng)安裝好Elasticsearch

kibana6.8.5 可視化工具

注意: kibana版本必須和Elasticsearch版本一致,否則會(huì)出現(xiàn)不可預(yù)料的錯(cuò)誤。

安裝參考:https://www.elastic.co/guide/cn/kibana/current/windows.html

下載:kibana-6.8.5-windows-x86_64.zip) 解壓。

**zip目錄文件: **

.zip 整個(gè)包是獨(dú)立的。默認(rèn)情況下,所有的文件和目錄都在 $KIBANA_HOME?—?解壓包時(shí)創(chuàng)建的目錄下。這是非常方便的,因?yàn)槟恍枰獎(jiǎng)?chuàng)建任何目錄來使用 Kibana,卸載 Kibana 只需要簡(jiǎn)單的刪除 $KIBANA_HOME 目錄。但還是建議修改一下配置文件和數(shù)據(jù)目錄,這樣就不會(huì)刪除重要數(shù)據(jù)。

類型 描述 默認(rèn)位置 設(shè)置
home Kibana home 目錄或 $KIBANA_HOME 。 解壓包時(shí)創(chuàng)建的目錄
bin 二進(jìn)制腳本,包括 kibana 啟動(dòng) Kibana 服務(wù)和 kibana-plugin 安裝插件。 $KIBANA_HOME\bin
config 配置文件包括 kibana.yml 。 $KIBANA_HOME\config
data Kibana 和其插件寫入磁盤的數(shù)據(jù)文件位置。 $KIBANA_HOME\data
optimize 編譯過的源碼。某些管理操作(如,插件安裝)導(dǎo)致運(yùn)行時(shí)重新編譯源碼。 $KIBANA_HOME\optimize
plugins 插件文件位置。每一個(gè)插件都一個(gè)單獨(dú)的二級(jí)目錄。 $KIBANA_HOME\plugins

配置系統(tǒng)環(huán)境變量:KIBANA_HOME=E:\Elasticsearch\kibana-6.8.5-windows-x86_64\bin

# 啟動(dòng) kibana
.\bin\kibana.bat
# 日志:輸出 log 到 STDOUT
# Ctrl-C 停止 Kibana

瀏覽器訪問:http://localhost:5601 安裝成功。

kibana 漢化:

從6.7版本開始,Kibana支持中文,無需再像之前那樣下載漢化包,甚至自己進(jìn)行翻譯

打開config/kibana.yml,找到最后一行,去掉#,并將"en"改成"zh-CN"

#i18n.locale: "en"
i18n.locale: "zh-CN"

**重啟kibana **

Springboot Elasticsearch 6.8.5

一、選擇版本

Spring Data Elasticsearch

參考:https://docs.spring.io/spring-data/elasticsearch/docs/3.2.0.RC3/reference/html/#preface.versions

Spring Data Elasticsearch、Elasticsearch 對(duì)應(yīng)版本

Spring Data Elasticsearch Elasticsearch
3.2.x 6.8.1
3.1.x 6.2.2
3.0.x 5.5.0
2.1.x 2.4.0
2.0.x 2.2.0
1.3.x 1.5.2

Spring Boot、Spring Data Elasticsearch、Elasticsearch 對(duì)應(yīng)版本

Spring Data Release Train Spring Data Elasticsearch Elasticsearch Spring Boot
Neumann[1] 4.0.x[1] 7.6.2 2.3.x[1]
Moore 3.2.x 6.8.6 2.2.x
Lovelace 3.1.x 6.2.2 2.1.x
Kay[2] 3.0.x[2] 5.5.0 2.0.x[2]
Ingalls[2] 2.1.x[2] 2.4.0 1.5.x[2]

dome參考:https://github.com/spring-projects/spring-data-examples/tree/master/elasticsearch

Java Elasticsearch 客戶端

官方推薦:https://www.elastic.co/guide/en/elasticsearch/client/index.html

二、Spring Data Elasticsearch

Spring Data Elasticsearch 默認(rèn)使用 High Level REST Client

版本:springboot 2.0.5、Elasticsearch6.8.5、springboot data elasticsearch3.2.5

pom.xml

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>3.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch</groupId>
    <artifactId>elasticsearch</artifactId>
    <version>6.8.5</version>
</dependency>

*.yml

spring:
  data:
    elasticsearch:
      repositories:
        enabled: true # 啟用 ElasticsearchTemplate
      properties:
        path:
          logs: ./elasticsearch/log   # ES日志存儲(chǔ)目錄
          data: ./elasticsearch/data  # ES數(shù)據(jù)存儲(chǔ)目錄
      cluster-name: my-cluster        # ES集群名稱,在elasticsearch.yml中配置 默 elasticsearch
      cluster-nodes: 127.0.0.1:9300   # ES集群節(jié)點(diǎn) 用逗號(hào)分隔 , java連接默9300,http連接默9200

實(shí)體類

@Data
@Document(indexName = "book_index", type = "book_type", indexStoreType = "fs", shards = 5, replicas = 1, refreshInterval = "-1")
public class BookEntity {
    @Id
    private String id;
    private String title;
    private String content;
    private int userId;
    private int weight;
}

Repository接口

@Component
public interface BookRepository extends ElasticsearchRepository<BookEntity, String> {
}

controller層

package com.dist.controller;

import com.dist.dao.BookRepository;
import com.dist.entity.BookEntity;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.elasticsearch.index.query.MultiMatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.SearchQuery;
import org.springframework.web.bind.annotation.*;

import static org.elasticsearch.index.query.QueryBuilders.*;

/**
 * @author*@*.com.cn
 * @data 2020/07/17 11:41
 */
@RestController
@Api(tags = {"BookElasticsearchController"}, description = "全文檢索")
public class BookElasticsearchController {

    @Autowired
    ElasticsearchTemplate elasticsearchTemplate;

    @Autowired
    BookRepository bookRepository;

    @ApiOperation(value = "添加索引", httpMethod = "POST")
    @PostMapping(value = "v1/book/add/{id}")
    public Object addbook(@ApiParam(defaultValue = "50") @PathVariable String id) {
        //創(chuàng)建索引
        // 1、直接用名稱創(chuàng)建索引
        //boolean indexRes = elasticsearchTemplate.createIndex("book_es");
        // 2、填入class對(duì)象創(chuàng)建索引
        //boolean indexRes = elasticsearchTemplate.createIndex(BookEntity.class);
        //System.out.println("======創(chuàng)建索引結(jié)果:" + indexRes + "=========");

        BookEntity bookEntity = new BookEntity();
        bookEntity.setId(id);
        bookEntity.setTitle("浣溪沙");
        bookEntity.setContent("宋·李清照 莫許杯深琥珀濃,未成沉醉意先融。疏鐘已應(yīng)晚來風(fēng)。瑞腦香消魂夢(mèng)斷");
        bookEntity.setUserId(51);
        bookEntity.setWeight(100);

        IndexQuery indexQuery = new IndexQueryBuilder()
                .withId(bookEntity.getId())
                .withObject(bookEntity)
                .build();
        String index = elasticsearchTemplate.index(indexQuery);
        //BookEntity document = bookRepository.save(bookEntity);
        return index;
    }

    @ApiOperation(value = "查詢?nèi)績(jī)?nèi)容", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/all")
    public Object srarch() {
        return bookRepository.findAll();
    }

    @ApiOperation(value = "根據(jù)id查詢內(nèi)容", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/id")
    public Object srarch(@ApiParam(defaultValue = "50") @RequestParam String id) {
        return bookRepository.findById(id);
    }

    @ApiOperation(value = "根據(jù)id更新內(nèi)容", httpMethod = "PUT")
    @PutMapping(value = "v1/book/srarch/updete")
    public Object updete(@ApiParam(defaultValue = "50") @RequestParam String id) {
        BookEntity bookEntity = new BookEntity();
        bookEntity.setId(id);
        bookEntity.setTitle("浣溪沙2");
        bookEntity.setContent("宋·李清照 莫許杯深琥珀濃,未成沉醉意先融。疏鐘已應(yīng)晚來風(fēng)。瑞腦香消魂夢(mèng)斷");
        bookEntity.setUserId(55);
        bookEntity.setWeight(102);
        return bookRepository.save(bookEntity);
    }

    @ApiOperation(value = "單字符串全文模糊查詢Ex", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/ex")
    public Object srarchEx(@ApiParam(value = "查詢內(nèi)容", defaultValue = "浣溪沙") @RequestParam String content,
                         @ApiParam(value = "當(dāng)前頁", defaultValue = "0") @RequestParam int page,
                         @ApiParam(value = "顯示多少條", defaultValue = "20") @RequestParam int size) {

        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery(content)).withPageable(PageRequest.of(page, size)).build();
        return bookRepository.search(searchQuery);
    }

    @ApiOperation(value = "多字段的匹配查詢Ex", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/queryBuilder")
    public Object srarchQueryBuilder(@ApiParam(value = "查詢內(nèi)容", defaultValue = "浣溪沙") @RequestParam String title) {

        MultiMatchQueryBuilder queryBuilder = multiMatchQuery(title, "title", "content");
        return bookRepository.search(queryBuilder);
    }

    @ApiOperation(value = "單字符串全文模糊查詢", notes = "查詢?nèi)孔侄蝺?nèi)容", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch")
    public Object srarch(@ApiParam(value = "查詢內(nèi)容", defaultValue = "浣溪沙") @RequestParam String content,
                         @ApiParam(value = "當(dāng)前頁", defaultValue = "0") @RequestParam int page,
                         @ApiParam(value = "顯示多少條", defaultValue = "20") @RequestParam int size) {
        //使用queryStringQuery完成單字符串查詢
        //單字符串默認(rèn)模糊查詢,默認(rèn)排序。將從所有字段中查找包含傳來的content分詞后字符串的數(shù)據(jù)集
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.queryStringQuery(content)).withPageable(PageRequest.of(page, size)).build();
        return elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
    }

    @ApiOperation(value = "某字段字符串模糊查詢", notes = "將從所有字段中查找包含傳來的content分詞后字符串的數(shù)據(jù)集", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/matchQuery")
    public Object srarchMatchQuery(@ApiParam(value = "查詢內(nèi)容", defaultValue = "浣溪沙") @RequestParam String content,
                                   @ApiParam(value = "當(dāng)前頁", defaultValue = "0") @RequestParam int page,
                                   @ApiParam(value = "顯示多少條", defaultValue = "20") @RequestParam int size) {
        //某字段(content)字符串模糊查詢
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(matchQuery("content", content)).withPageable(PageRequest.of(page, size)).build();
        return elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
    }

    @ApiOperation(value = "短語匹配", notes = "短語必須是連續(xù)的 不知?dú)w路 不歸路", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/PhraseQuery")
    public Object srarchPhraseQuery(@ApiParam("查詢內(nèi)容") @RequestParam String content,
                                    @ApiParam(value = "當(dāng)前頁", defaultValue = "0") @RequestParam int page,
                                    @ApiParam(value = "顯示多少條", defaultValue = "20") @RequestParam int size) {

        // PhraseMatch查詢,短語匹配,單字段對(duì)某短語進(jìn)行匹配查詢,短語分詞的順序會(huì)影響結(jié)果
        //類似于數(shù)據(jù)庫里的 %落日熔金%
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.matchPhraseQuery("content", content)).withPageable(PageRequest.of(page, size)).build();
        return elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
    }

    @ApiOperation(value = "完全匹配查詢", notes = "最嚴(yán)格的匹配,不進(jìn)行分詞", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/TermQuery")
    public Object srarchTermQuery(@ApiParam(value = "id", defaultValue = "5") @RequestParam int userId,
                                  @ApiParam(value = "當(dāng)前頁", defaultValue = "0") @RequestParam int page,
                                  @ApiParam(value = "顯示多少條", defaultValue = "10") @RequestParam int size) {
        //term一般適用于做過濾器filter的情況,譬如我們?nèi)ゲ樵僼itle中包含“浣溪沙”且userId=1時(shí),那么就可以用termQuery(“userId”, 1)作為查詢的filter
        //不對(duì)傳來的值分詞,去找完全匹配的
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(termQuery("userId", userId)).withPageable(PageRequest.of(page, size)).build();
        return elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
    }

    @ApiOperation(value = "多字段的匹配查詢", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/MultiMatchQuery")
    public Object srarchMultiMatchQuery(@ApiParam("查詢內(nèi)容") @RequestParam String title,
                                        @ApiParam(value = "當(dāng)前頁", defaultValue = "0") @RequestParam int page,
                                        @ApiParam(value = "顯示多少條", defaultValue = "10") @RequestParam int size) {

        //MultiMatchQuery: 多字段匹配 "title","content" ,只要任何一個(gè)字段包括該字符串即可
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(QueryBuilders.multiMatchQuery(title, "title", "content"))
                .withPageable(PageRequest.of(page, size))
                .build();

        //MultiMatchQueryBuilder multiMatchQuery = QueryBuilders.multiMatchQuery(title, "title", "content");
        //構(gòu)建查詢對(duì)象
        /*SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withQuery(multiMatchQuery)
                .withIndices("book_es")  //索引名
                .withPageable(PageRequest.of(page, size, new Sort(Sort.Direction.DESC, "id")))
                .build();*/
        //執(zhí)行查詢
        return elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
    }

    @ApiOperation(value = "多字段合并查詢", httpMethod = "GET")
    @GetMapping(value = "v1/book/srarch/BoolQuery")
    public Object srarchBoolQuery(@ApiParam(value = "userId", defaultValue = "2") @RequestParam String userId,
                                  @ApiParam(value = "weight", defaultValue = "14") @RequestParam String weight,
                                  @ApiParam(value = "title", defaultValue = "浣溪沙") @RequestParam String title) {
        //boolQuery 可以設(shè)置多個(gè)條件的查詢方式,用來組合多個(gè)Query,組合方式有四種:must,mustnot,filter,should
        /*must代表返回的文檔必須滿足must子句的條件,會(huì)參與計(jì)算分值;
        filter代表返回的文檔必須滿足filter子句的條件,但不會(huì)參與計(jì)算分值;
        should代表返回的文檔可能滿足should子句的條件,也可能不滿足,有多個(gè)should時(shí)滿足任何一個(gè)就可以,通過minimum_should_match設(shè)置至少滿足幾個(gè)。
        mustnot代表必須不滿足子句的條件。*/
        SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(QueryBuilders.boolQuery().must(termQuery("userId", userId))
                .should(rangeQuery("weight").lt(weight)).must(matchQuery("title", title))).build();
        return elasticsearchTemplate.queryForList(searchQuery, BookEntity.class);
    }

    @ApiOperation(value = "刪除索引", httpMethod = "DELETE")
    @DeleteMapping(value = "v1/book/delete")
    public void deleteIndex(@ApiParam("id") @RequestParam String id) {

        //刪除索引
        BookEntity bookEntity = new BookEntity();
        bookEntity.setId(id);

        //bookRepository.delete(bookEntity);
        //根據(jù)id刪除
        bookRepository.deleteById(id);
        //刪除所有
        //bookRepository.deleteAll();
    }

    @ApiOperation(value = "刪除所有索引", httpMethod = "DELETE")
    @DeleteMapping(value = "v1/book/delete/all")
    public void deleteAllIndex() {
        //刪除所有
        bookRepository.deleteAll();
    }

}

InitBookData 初始化數(shù)據(jù)

/**
 * Email: *.com.cn
 * Desc:只初始化一次測(cè)試數(shù)據(jù)
 */
@Component
public class InitBookData {

    @Autowired
    BookRepository bookRepository;

    @PostConstruct
    public void init() {
        //只初始化一次
        Iterable<BookEntity> posts = bookRepository.findAll();
        if (posts.iterator().hasNext()) {
            return;
        }
        for (int i = 0; i < 40; i++) {
            BookEntity book = new BookEntity();
            book.setTitle(getTitle().get(i));
            book.setContent(getContent().get(i));
            book.setWeight(i);
            book.setUserId(i % 10);
            bookRepository.save(book);
        }
    }

    private List<String> getTitle() {
        List<String> list = new ArrayList<>();
        list.add("《如夢(mèng)令·常記溪亭日暮》");
        list.add("《醉花陰·薄霧濃云愁永晝》");
        list.add("《聲聲慢·尋尋覓覓》");
        list.add("《永遇樂·落日熔金》");
        list.add("《如夢(mèng)令·昨夜雨疏風(fēng)驟》");
        list.add("《漁家傲·雪里已知春信至》");
        list.add("《點(diǎn)絳唇·蹴[1]罷秋千》");
        list.add("《點(diǎn)絳唇·寂寞深閨》");
        list.add("《蝶戀花·淚濕羅衣脂粉滿》");
        list.add("《蝶戀花 離情》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《減字木蘭花·賣花擔(dān)上》");
        list.add("《臨江仙·歐陽公作《蝶戀花》");
        list.add("《臨江仙·庭院深深深幾許》");
        list.add("《念奴嬌·蕭條庭院》");
        list.add("《菩薩蠻·風(fēng)柔日薄春猶早》");
        list.add("《菩薩蠻·歸鴻聲斷殘?jiān)票獭?);
        list.add("《武陵春·風(fēng)住塵香花已盡》");
        list.add("《一剪梅·紅藕香殘玉蕈秋》");
        list.add("《漁家傲·天接云濤連曉霧》");
        list.add("《鷓鴣天·暗淡輕黃體性柔》");
        list.add("《鷓鴣天·寒日蕭蕭上鎖窗》");
        list.add("《一剪梅·紅藕香殘玉簟秋》");
        list.add("《如夢(mèng)令·常記溪亭日暮》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《蝶戀花·淚濕羅衣脂粉滿》");
        list.add("《蝶戀花·暖日晴風(fēng)初破凍》");
        list.add("《鷓鴣天·寒日蕭蕭上鎖窗》");
        list.add("《醉花陰·薄霧濃云愁永晝》");
        list.add("《鷓鴣天·暗淡輕黃體性柔》");
        list.add("《蝶戀花·永夜懨懨歡意少》");
        list.add("《浣溪沙》");
        list.add("《浣溪沙》");
        list.add("《如夢(mèng)令·誰伴明窗獨(dú)坐》");
        return list;
    }

    private List<String> getContent() {
        List<String> list = new ArrayList<>();
        list.add("初中 宋·李清照 常記溪亭日暮,沉醉不知?dú)w路,興盡晚回舟,誤入藕花深處。爭(zhēng)渡,爭(zhēng)渡");
        list.add("重陽節(jié) 宋·李清照 薄霧濃云愁永晝,瑞腦消金獸。佳節(jié)又重陽,玉枕紗廚,半夜涼初透。東");
        list.add("閨怨詩 宋·李清照 尋尋覓覓,冷冷清清,凄凄慘慘戚戚。乍暖還寒時(shí)候,最難將息。三杯兩");
        list.add("元宵節(jié) 宋·李清照 落日熔金,暮云合璧,人在何處。染柳煙濃,吹梅笛怨,春意知幾許。元");
        list.add("婉約詩 宋·李清照 昨夜雨疏風(fēng)驟,濃睡不消殘酒,試問卷簾人,卻道海棠依舊。知否,知否");
        list.add("描寫梅花 宋·李清照 雪里已知春信至,寒梅點(diǎn)綴瓊枝膩,香臉半開嬌旖旎,當(dāng)庭際,玉人浴出");
        list.add(" 宋·李清照 蹴罷秋千,起來慵整纖纖手。露濃花瘦,薄汗輕衣透。見客入來,襪刬金");
        list.add("閨怨詩 宋·李清照 寂寞深閨,柔腸一寸愁千縷。惜春春去。幾點(diǎn)催花雨。倚遍闌干,只是無");
        list.add("婉約詩 宋·李清照 淚濕羅衣脂粉滿。四疊陽關(guān),唱到千千遍。人道山長(zhǎng)水又?jǐn)?。蕭蕭微雨?);
        list.add("描寫春天 宋·李清照 暖雨晴風(fēng)初破凍,柳眼梅腮,已覺春心動(dòng)。酒意詩情誰與共?淚融殘粉花");
        list.add("寒食節(jié) 宋·李清照 淡蕩春光寒食天,玉爐沈水裊殘煙,夢(mèng)回山枕隱花鈿。海燕未來人斗草,");
        list.add(" 宋·李清照 髻子傷春慵更梳,晚風(fēng)庭院落梅初,淡云來往月疏疏,玉鴨薰?fàn)t閑瑞腦,");
        list.add(" 宋·李清照 莫許杯深琥珀濃,未成沉醉意先融。疏鐘已應(yīng)晚來風(fēng)。瑞腦香消魂夢(mèng)斷,");
        list.add("閨怨詩 宋·李清照 小院閑窗春已深,重簾未卷影沉沉。倚樓無語理瑤琴,遠(yuǎn)岫出山催薄暮。");
        list.add("愛情詩 宋·李清照 繡幕芙蓉一笑開,斜偎寶鴨親香腮,眼波才動(dòng)被人猜。一面風(fēng)情深有韻,");
        list.add("描寫春天 宋·李清照 賣花擔(dān)上,買得一枝春欲放。淚染輕勻,猶帶彤霞曉露痕。怕郎猜道,奴");
        list.add("》 宋·李清照 歐陽公作《蝶戀花》,有“深深深幾許”之句,予酷愛之。用其語作“庭");
        list.add("描寫梅花 宋·李清照 庭院深深深幾許,云窗霧閣春遲,為誰憔悴損芳姿。夜來清夢(mèng)好,應(yīng)是發(fā)");
        list.add("寒食節(jié) 宋·李清照 蕭條庭院,又斜風(fēng)細(xì)雨,重門須閉。寵柳嬌花寒食近,種種惱人天氣。險(xiǎn)");
        list.add("思鄉(xiāng)詩 宋·李清照 風(fēng)柔日薄春猶早,夾衫乍著心情好。睡起覺微寒,梅花鬢上殘。故鄉(xiāng)何處");
        list.add("描寫春天 宋·李清照 歸鴻聲斷殘?jiān)票?,背窗雪落爐煙直。燭底鳳釵明,釵頭人勝輕。角聲催曉");
        list.add("閨怨詩 宋·李清照 風(fēng)住塵香花已盡,日晚倦梳頭。物是人非事事休,欲語淚先流。聞?wù)f雙溪");
        list.add(" 宋·李清照 紅藕香殘玉蕈秋,輕解羅裳,獨(dú)上蘭舟。云中誰寄錦書來?雁字回時(shí),月");
        list.add("豪放詩 宋·李清照 天接云濤連曉霧。星河欲轉(zhuǎn)千帆舞。仿佛夢(mèng)魂歸帝所。聞天語。殷勤問我");
        list.add("描寫花 宋·李清照 暗淡輕黃體性柔。情疏跡遠(yuǎn)只香留。何須淺碧深紅色,自是花中第一流。");
        list.add("描寫秋天 宋·李清照 寒日蕭蕭上瑣窗,梧桐應(yīng)恨夜來霜。酒闌更喜團(tuán)茶苦,夢(mèng)斷偏宜瑞腦香。");
        list.add("閨怨詩 宋·李清照 紅藕香殘玉簟秋。輕解羅裳,獨(dú)上蘭舟。云中誰寄錦書來?雁字回時(shí),月");
        list.add(" 宋·李清照 常記溪亭日暮。沈醉不知?dú)w路。興盡晚回舟,誤入藕花深處。爭(zhēng)渡。爭(zhēng)渡");
        list.add(" 宋·李清照 莫許杯深琥珀濃。未成沈醉意先融。已應(yīng)晚來風(fēng)。瑞腦香消魂夢(mèng)斷,");
        list.add(" 宋·李清照 小院閑窗春色深。重簾未卷影沈沈。倚樓無語理瑤琴。遠(yuǎn)岫出山催薄暮,");
        list.add(" 宋·李清照 淡蕩春光寒食天。玉爐沈水裊殘煙。夢(mèng)回山枕隱花鈿。海燕未來人斗草,");
        list.add(" 宋·李清照 淚濕羅衣脂粉滿。四疊陽關(guān),唱到千千遍。人道山長(zhǎng)山又?jǐn)?。蕭蕭微雨?);
        list.add(" 宋·李清照 暖日晴風(fēng)初破凍。柳眼眉腮,已覺春心動(dòng)。酒意詩情誰與共。淚融殘粉花");
        list.add(" 宋·李清照 寒日蕭蕭上鎖窗。梧桐應(yīng)恨夜來霜。酒闌更喜團(tuán)茶苦,夢(mèng)斷偏宜瑞腦香。");
        list.add(" 宋·李清照 薄霧濃云愁永晝。瑞腦消金獸。佳節(jié)又重陽,玉枕紗廚,半夜涼初透。東");
        list.add(" 宋·李清照 暗淡輕黃體性柔。情疏跡遠(yuǎn)只香留。何須淺碧深紅色,自是花中第一流。");
        list.add(" 宋·李清照 永夜懨懨歡意少。空夢(mèng)長(zhǎng)安,認(rèn)取長(zhǎng)安道。為報(bào)今年春色好?;ü庠掠耙?);
        list.add(" 宋·李清照 髻子傷春慵更梳。晚風(fēng)庭院落梅初。淡云來往月疏疏。玉鴨熏爐閑瑞腦,");
        list.add(" 宋·李清照 繡面芙蓉一笑開。斜飛寶鴨襯香腮。眼波才動(dòng)被人猜。一面風(fēng)情深有韻,");
        list.add(" 宋·李清照 誰伴明窗獨(dú)坐,我共影兒倆個(gè)。燈盡欲眠時(shí),影也把人拋躲。無那,無那");
        return list;
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容