一、滾動查詢
參考: 中國開源社區(qū)
/**
* 滾動查詢, 并批量保存
*
* @param indexName
* @return
*/
public int scrollIndexName(String indexName) {
NativeSearchQueryBuilder nativeSearchQueryBuilder = new NativeSearchQueryBuilder();
NativeSearchQuery searchQuery = nativeSearchQueryBuilder.withQuery(QueryBuilders.matchAllQuery()).build();
// 滾動一次數據量為1w
searchQuery.setMaxResults(10000);
// 第一次查詢
SearchScrollHits<RawDocDO> searchScrollHits = elasticsearchRestTemplate.searchScrollStart(60000, searchQuery, RawDocDO.class, IndexCoordinates.of(indexName));
String scrollId = searchScrollHits.getScrollId();
List<RawDocDO> rawDocDOList = new ArrayList<>();
for (SearchHit<RawDocDO> searchHit : searchScrollHits.getSearchHits()) {
RawDocDO content = searchHit.getContent();
rawDocDOList.add(content);
}
String replace = indexName.replace("index", "latest");
// 創(chuàng)建索引結構
createIndex(replace, indexName.substring(6, 8));
// 批量插入數據
bulkIndexName(rawDocDOList, replace);
// 批量創(chuàng)建總數
int count = rawDocDOList.size();
Long temp = searchScrollHits.getTotalHits();
temp -= 10000;
List<String> scrollIdList = new ArrayList<>();
scrollIdList.add(scrollId);
// 循環(huán)滾動插入
while (temp > 0) {
// 繼續(xù)滾動
searchScrollHits = elasticsearchRestTemplate.searchScrollContinue(scrollId, 60000, RawDocDO.class, IndexCoordinates.of(indexName));
List<RawDocDO> rawDocDOList2 = new ArrayList<>();
for (SearchHit<RawDocDO> searchHit : searchScrollHits.getSearchHits()) {
RawDocDO content = searchHit.getContent();
rawDocDOList2.add(content);
}
// 批量插入數據
bulkIndexName(rawDocDOList2, replace);
// 累加
count += rawDocDOList2.size();
scrollId = searchScrollHits.getScrollId();
temp -= 10000;
}
logger.info("批量插入{}條數據到{}索引中", rawDocDOList.size(), replace);
scrollIdList.add(scrollId);
// 清除 scroll
elasticsearchRestTemplate.searchScrollClear(scrollIdList);
return count;
}
二、設置權重
- 官方介紹
- ES 的權重排序
- 【Elasticsearch】ElasticSearch 7.8 多字段權重排序
三、動態(tài)模板
1、基本概念
- ElasticSearch7.3學習(十三)----定制動態(tài)映射(dynamic mapping)
- 【Elasticsearch教程4】Mapping 動態(tài)映射
- 【Elasticsearch教程5】Mapping 動態(tài)模板 Dynamic templates
2、原生創(chuàng)建動態(tài)模板
#刪除已有index
DELETE my_index
# 創(chuàng)建dynamic_templates,以is開頭的被識別為boolean類型,string類型匹配為keyword類型
PUT my_index
{
"mappings": {
"dynamic_templates": [
{
"strings_as_boolean": {
"match_mapping_type": "string",
"match":"is*",
"mapping": {
"type": "boolean"
}
}
},
{
"strings_as_keywords": {
"match_mapping_type": "string",
"mapping": {
"type": "keyword"
}
}
}
]
}
}
3、ElasticSearch-data整合springboot創(chuàng)建
注意事項:需要先創(chuàng)建模板,然后添加數據,新增的數據則會按照模板的格式來創(chuàng)建。如果直接設置了索引的mapping,則模板映射會失效,模板是用戶添加數據時候自動給屬性添加映射類型。
- 在resource目錄下新建template-mapping.json
{
"dynamic_templates": [
{
"content": {
"match": "content",
"mapping": {
"analyzer": "standard",
"search_analyzer": "english"
}
}
},
{
"title": {
"match": "title",
"mapping": {
"analyzer": "standard",
"search_analyzer": "english"
}
}
},
{
"summary": {
"match": "summary",
"mapping": {
"analyzer": "standard",
"search_analyzer": "english"
}
}
}
]
}
- 定義實體對象
package com.tmxbase.psas.dal.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
@ToString
@Document(indexName = "#{@esAttribute.indexName}", replicas = 0, shards = 5)
//@Mapping(mappingPath = "/raw-doc-mapping.json")
//@DynamicTemplates(mappingPath = "/raw-doc-templates.json")
@Setting(settingPath = "/rawDoc-setting.json")
public class RawDocDO implements Serializable {
// 字段
public static final String ENTRY_ID_FIELD = "_id";
@Id
private String docId; // 數據id
@Field(type = FieldType.Text, analyzer = "ik_smart", termVector = TermVector.with_positions_offsets, similarity = Similarity.BM25, fielddata = true)
private String summary; // 文章摘要
@Field(type = FieldType.Text, analyzer = "ik_smart", termVector = TermVector.with_positions_offsets, similarity = Similarity.BM25, fielddata = true)
private String content; // 文章內容
@Field(type = FieldType.Text, analyzer = "ik_smart", termVector = TermVector.with_positions_offsets, similarity = Similarity.BM25, fielddata = true)
private String title; // 文章標題
@Field(type = FieldType.Keyword)
private String media; // 媒體類型
@Field(type = FieldType.Byte)
private byte emotion; // 文章情感類型 positive=3 neutral=2 negative=1
private String lan; // 文章所屬語言
@Field(type = FieldType.Keyword, index = false)
private String href; // 文章來源頁
@Field(type = FieldType.Keyword)
private String country; // 文章來源國家
@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss")
private String time; // 文章發(fā)布時間
}
四、分詞器
- Lucene中常用的幾個分詞器
- ES之分詞以及各大分詞器
- ES-文本分析(analysis)
- Elasticsearch分詞器簡介與使用(一)
1、內置的分詞器
(1)ES的內置分詞器如下:
分詞器 | 描述 |
---|---|
Standard Analyzer | ES的標準分詞器,主要用于英文分詞 |
Simple Analyzer | 簡單分詞器,按非英文字母進行分詞,同時轉化成小寫字母 |
Whitespace Analyzer | 空格分詞器,按空格分詞 |
Stop Analyzer | 類似于Simple Analyzer,但是增加了停頓詞功能 |
Keyword Analyzer | 關鍵詞分詞器 |
Pattern Analyzer | 正則分詞器,支持停頓詞 |
Language Analyzer | 針對特定語言的分詞器 |
Fingerprint Analyzer | 指紋分詞器,通過創(chuàng)建標記進行重復檢測 |
內置的分詞器一般用于簡單的測試,或者簡單常規(guī)要求的英文文檔索引。
(2)內置分詞器設置禁用詞
- 在elasticSearch配置文件config目錄下,添加stopWord.txt文件。
- 在添加索引setting時候,加入配置
2、IK分詞器使用
ES如果需要索引中文內容,則使用最多的分詞器就是IK分詞器了。github地址:https://github.com/medcl/elasticsearch-analysis-ik
IK_smart設置禁用詞
ik分詞器設置禁用詞與默認的分詞器設置有所不同。
-
在 elasticsearch-7.x.x\plugins\ik\config\ 目錄下,打開目錄可以看到有 stopword.dic 和 extra_stopword.dic 兩個文件。stopword.dic 里面的為配置的英文停用詞,extra_stopword.dic 里面為配置的中文停用詞。
-
默認是使用 stopword.dic 的,想要使用 extra_stopword.dic 的話是需要在 ik 中進行配置的,配置文件為 IKAnalyzer.cfg.xml
(3) 配置完成后重啟 elasticsearch,就可以發(fā)現停用詞已經不再對搜索產生影響了。
3、 安裝其他分詞器
安裝越南語分詞器
五、路由Routing
代寫…
六、聚合分組查詢
待寫…
七、動態(tài)的為ElasticSearch的@Document指定index
1.在配置文件里設置indexName(只能設置一個indexName)
創(chuàng)建配置Bean:
@Component("esAttribute")
// 指定配置文件
@PropertySource("classpath:application.properties")
public class EsAttribute {
@Value("${index.name}")
private String indexName;
public String getIndexName() {
return indexName;
}
public void setIndexName(String indexName) {
this.indexName = indexName;
}
}
在application.properties中添加:
index.name=tomcat1-*
在ElasticSearch返回的類型中使用:
@Data
@NoArgsConstructor
@Accessors(chain = true)
@Document(indexName = "#{@esAttribute.indexName}", shards = 1, replicas = 0,createIndex = true)
public class AppLogBean implements Serializable {
private static final long serialVersionUID = -729624360020627702L;
@Id
private String id;
@Field(type = FieldType.Keyword)
private String customer_time;
}
在操作過程中可能會報這個錯誤:java.lang.IllegalArgumentException: Could not resolve placeholder ‘index.name’ in value "${index.name}
原因可能是使用@Value的類上未指定配置文件:@PropertySource("classpath:application.properties")
也可能是你的配置文件是yml類型,而該注解只支持properties文件引入,并不支持yml,至于如何讓其可以加載yml文件,自行搜索。
2.在代碼中設置indexName(可以根據條件設置不同的indexName)
創(chuàng)建配置Bean:
@Component("esAttribute")
public class EsAttribute {
private String indexName;
public String getIndexName() {
return indexName;
}
public void setIndexName(String indexName) {
this.indexName = indexName;
}
}
在你需要的地方設置indexName:
@Autowired
private EsAttribute esAttribute;
// 動態(tài)設置索引名稱
esAttribute.setIndexName("tomcat1-*");
logger.info("索引名稱indexName:" + esAttribute.getIndexName());
在ElasticSearch返回的類型中使用:文章來源:http://www.zghlxwxcb.cn/news/detail-738704.html
@Data
@NoArgsConstructor
@Accessors(chain = true)
@Document(indexName = "#{@esAttribute.indexName}", shards = 1, replicas = 0,createIndex = true)
public class AppLogBean implements Serializable {
private static final long serialVersionUID = -729624360020627702L;
@Id
private String id;
@Field(type = FieldType.Keyword)
private String customer_time;
}
八、ES嵌套類型
1、Nested
ES嵌套(Nested)文檔使用文章來源地址http://www.zghlxwxcb.cn/news/detail-738704.html
- ES中 Nested 類型的原理和使用
- Elasticsearch Nested類型及應用【2】
2、父子文檔
- ElasticSearch(四):ES nested嵌套文檔與父子文檔處理
- elasticsearch之嵌套對象、父子文檔
到了這里,關于Elastic Search一些用法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!