
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
- Transport Client 不推薦
- Java High Level REST Client 推薦
- Reactive REST Client 不推薦
二、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;
}
}