什么是ElasticSearch
Elasticsearch 是一個分布式、RESTful 風(fēng)格的搜索和數(shù)據(jù)分析引擎,適用于包括文本、數(shù)字、地理空間、結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)等在內(nèi)的所有類型的數(shù)據(jù)。Elasticsearch 在 Apache Lucene 的基礎(chǔ)上開發(fā)而成,由 Elasticsearch N.V.(即現(xiàn)在的 Elastic)于 2010 年首次發(fā)布。Elasticsearch 以其簡單的 REST 風(fēng)格 API、分布式特性、速度和可擴展性而聞名,是 Elastic Stack 的核心組件;Elastic Stack 是一套適用于數(shù)據(jù)采集、擴充、存儲、分析和可視化的免費開源工具。人們通常將 Elastic Stack 稱為 ELK Stack(代指 Elasticsearch、Logstash 和 Kibana),目前 Elastic Stack 包括一系列豐富的輕量型數(shù)據(jù)采集代理,這些代理統(tǒng)稱為 Beats,可用來向 Elasticsearch 發(fā)送數(shù)據(jù)。
全文檢索是我們在實際項目開發(fā)中最常見的需求了,而ElasticSearch是目前全文檢索引擎的首選,它可以快速的存儲,搜索和分析海量的數(shù)據(jù),維基百科,GitHub,Stack Overflow都采用了ElasticSearch。
官方網(wǎng)站:https://www.elastic.co/cn/elasticsearch/
中文社區(qū):https://elasticsearch.cn/explore/
Elasticsearch是java開發(fā)的,在7.8版本以上,需要使用jdk1.8以上版本。
官網(wǎng)訪問地址:https://www.elastic.co/cn/downloads/elasticsearch
Elasticsearch是面向文檔型數(shù)據(jù)庫,一條數(shù)據(jù)在這里就是一個文檔。為了方便大家理解,我們將Elasticsearch里存儲文檔數(shù)據(jù)與關(guān)系型數(shù)據(jù)庫mysql存儲數(shù)據(jù)的概念進(jìn)行類比
ES里的Index可以看做一個庫,而type相當(dāng)于表,Documents相當(dāng)于行。
這里type的概念逐漸被弱化,Elasticsearch 6.x中,一個index下只能包含一個type,Elasticsearch 7.x中,type的概念已經(jīng)被刪除了。
Elasticsearch 的用途是什么?
Elasticsearch 在速度和可擴展性方面都表現(xiàn)出色,而且還能夠索引多種類型的內(nèi)容,這意味著其可用于多種用例:
應(yīng)用程序搜索 搜索的數(shù)據(jù)對象是大量的非結(jié)構(gòu)化的文本數(shù)據(jù)。
網(wǎng)站搜索 文件記錄達(dá)到數(shù)十萬或數(shù)百萬個甚至更多。
企業(yè)搜索 需求非常靈活的全文搜索查詢。
日志處理和分析
基礎(chǔ)設(shè)施指標(biāo)和容器監(jiān)測
應(yīng)用程序性能監(jiān)測
地理空間數(shù)據(jù)分析和可視化
安全分析
業(yè)務(wù)分析
ElasticSearch基本概念
ES存儲結(jié)構(gòu) | Mysql存儲結(jié)構(gòu) |
---|---|
Index(索引) | 表 |
文檔 | 行,一行數(shù)據(jù) |
Field(字段) | 表字段 |
mapping(映射) | 表結(jié)構(gòu)定義 |
類型
類型是用來定義數(shù)據(jù)結(jié)構(gòu)的
在每一個index下面,可以有一個或者多個type,好比數(shù)據(jù)庫里面的一張表。
相當(dāng)于表結(jié)構(gòu)的描述,描述每個字段的類型。
文檔
文檔就是最終的數(shù)據(jù)了,可以認(rèn)為一個文檔就是一條記錄。
是ES里面最小的數(shù)據(jù)單元,就好比表里面的一條數(shù)據(jù)
字段
好比關(guān)系型數(shù)據(jù)庫中列的概念,一個document有一個或者多個field組成。
Node節(jié)點
就是集群中的一臺服務(wù)器
shard:分片
一臺服務(wù)器,無法存儲大量的數(shù)據(jù),ES把一個index里面的數(shù)據(jù),分為多個shard,分布式的存儲在各個服務(wù)器上面。
replica:副本
一個分布式的集群,難免會有一臺或者多臺服務(wù)器宕機,如果我們沒有副本這個概念。就會造成我們的shard發(fā)生故障,無法提供正常服務(wù)。
??我們?yōu)榱吮WC數(shù)據(jù)的安全,我們引入了replica的概念,跟hdfs里面的概念是一個意思。可以保證我們數(shù)據(jù)的安全。
??在ES集群中,我們一模一樣的數(shù)據(jù)有多份,能正常提供查詢和插入的分片我們叫做 primary shard,其余的我們就管他們叫做 replica shard(備份的分片)
??當(dāng)我們?nèi)ゲ樵償?shù)據(jù)的時候,我們數(shù)據(jù)是有備份的,它會同時發(fā)出命令讓我們有數(shù)據(jù)的機器去查詢結(jié)果,最后誰的查詢結(jié)果快,我們就要誰的數(shù)據(jù)(這個不需要我們?nèi)タ刂?,它?nèi)部就自己控制了)
在默認(rèn)情況下,我們創(chuàng)建一個庫的時候,默認(rèn)會幫我們創(chuàng)建5個主分片(primary shrad)和5個副分片(replica shard),所以說正常情況下是有10個分片的。
??同一個節(jié)點上面,副本和主分片是一定不會在一臺機器上面的,就是擁有相同數(shù)據(jù)的分片,是不會在同一個節(jié)點上面的。
??所以當(dāng)你有一個節(jié)點的時候,這個分片是不會把副本存在這僅有的一個節(jié)點上的,當(dāng)你新加入了一臺節(jié)點,ES會自動的給你在新機器上創(chuàng)建一個之前分片的副本。
倒排索引
Elasticsearch是通過Lucene的倒排索引技術(shù)實現(xiàn)比關(guān)系型數(shù)據(jù)庫更快的過濾。特別是它對多條件的過濾支持非常好.
倒排索引是搜索引擎的核心。搜索引擎的主要目標(biāo)是在查找發(fā)生搜索條件的文檔時提供快速搜索。ES中的倒排索引其實就是 lucene 的倒排索引,區(qū)別于傳統(tǒng)的正向索引,倒排索引會再存儲數(shù)據(jù)時將關(guān)鍵詞和數(shù)據(jù)進(jìn)行關(guān)聯(lián),保存到倒排表中,然后查詢時,將查詢內(nèi)容進(jìn)行分詞后在倒排表中進(jìn)行查詢,最后匹配數(shù)據(jù)即可。
ElasticSearch相關(guān)安裝
Elasticsearch安裝
Elasticsearch介紹和安裝
elastic產(chǎn)品各個版本下載地址
ElasticSearch集群
ELK日志監(jiān)控系統(tǒng)搭建
ElasticSearch配置文件詳解
- 集群名稱,默認(rèn)為elasticsearch #配置es的集群名稱,同一個集群中的多個節(jié)點使用相同的標(biāo)識
#如果在同一網(wǎng)段下有多個集群,就可以用這個屬性來區(qū)分不同的集群。
cluster.name: elasticsearch
2. 節(jié)點名稱,es啟動時會自動創(chuàng)建節(jié)點名稱,但你也可進(jìn)行配置:
node.name: “aaa”
3. 是否作為主節(jié)點,每個節(jié)點都可以被配置成為主節(jié)點,默認(rèn)值為true:
node.master: true
4. 是否存儲數(shù)據(jù),即存儲索引片段,默認(rèn)值為true:
node.data: true
master和data同時配置會產(chǎn)生一些奇異的效果:
1) 當(dāng)master為false,而data為true時,會對該節(jié)點產(chǎn)生嚴(yán)重負(fù)荷;
2) 當(dāng)master為true,而data為false時,該節(jié)點作為一個協(xié)調(diào)者;
3) 當(dāng)master為false,data也為false時,該節(jié)點就變成了一個負(fù)載均衡器。
你可以通過連接http://localhost:9200/_cluster/health或者h(yuǎn)ttp://localhost:9200/_cluster/nodes,或者使用插件http://github.com/lukas-vlcek/bigdesk或http://mobz.github.com/elasticsearch-head來查看集群狀態(tài)。
5. 每個節(jié)點都可以定義一些與之關(guān)聯(lián)的通用屬性,用于后期集群進(jìn)行碎片分配時的過濾:
node.rack: rack314
6. 默認(rèn)情況下,多個節(jié)點可以在同一個安裝路徑啟動,如果你想讓你的es只啟動一個節(jié)點,可以進(jìn)行如下設(shè)置:
node.max_local_storage_nodes: 1
7. 設(shè)置一個索引的碎片數(shù)量,默認(rèn)值為5:
index.number_of_shards: 5
8. 設(shè)置一個索引可被復(fù)制的數(shù)量,默認(rèn)值為1:
index.number_of_replicas: 1
當(dāng)你想要禁用公布式時,你可以進(jìn)行如下設(shè)置:
index.number_of_shards: 1
index.number_of_replicas: 0
這兩個屬性的設(shè)置直接影響集群中索引和搜索操作的執(zhí)行。假設(shè)你有足夠的機器來持有碎片和復(fù)制品,那么可以按如下規(guī)則設(shè)置這兩個值:
1) 擁有更多的碎片可以提升索引執(zhí)行能力,并允許通過機器分發(fā)一個大型的索引;
2) 擁有更多的復(fù)制器能夠提升搜索執(zhí)行能力以及集群能力。
對于一個索引來說,number_of_shards只能設(shè)置一次,而number_of_replicas可以使用索引更新設(shè)置API在任何時候被增加或者減少。
ElasticSearch關(guān)注加載均衡、遷移、從節(jié)點聚集結(jié)果等等。可以嘗試多種設(shè)計來完成這些功能。
可以連接http://localhost:9200/A/_status來檢測索引的狀態(tài)。
9. 配置文件所在的位置,即elasticsearch.yml和logging.yml所在的位置:
path.conf: /path/to/conf
10. 分配給當(dāng)前節(jié)點的索引數(shù)據(jù)所在的位置:
path.data: /path/to/data
可以可選擇的包含一個以上的位置,使得數(shù)據(jù)在文件級別跨越位置,這樣在創(chuàng)建時就有更多的自由路徑,如:
path.data: /path/to/data1,/path/to/data2
11. 臨時文件位置:
path.work: /path/to/work
12. 日志文件所在位置:
path.logs: /path/to/logs
13. 插件安裝位置:
path.plugins: /path/to/plugins
14. 插件托管位置,若列表中的某一個插件未安裝,則節(jié)點無法啟動:
plugin.mandatory: mapper-attachments,lang-groovy
15. JVM開始交換時,ElasticSearch表現(xiàn)并不好:你需要保障JVM不進(jìn)行交換,可以將bootstrap.mlockall設(shè)置為true禁止交換:
bootstrap.mlockall: true
請確保ES_MIN_MEM和ES_MAX_MEM的值是一樣的,并且能夠為ElasticSearch分配足夠的內(nèi)在,并為系統(tǒng)操作保留足夠的內(nèi)存。
16. 默認(rèn)情況下,ElasticSearch使用0.0.0.0地址,并為http傳輸開啟9200-9300端口,為節(jié)點到節(jié)點的通信開啟9300-9400端口,也可以自行設(shè)置IP地址:
network.bind_host: 192.168.0.1
17. publish_host設(shè)置其他節(jié)點連接此節(jié)點的地址,如果不設(shè)置的話,則自動獲取,publish_host的地址必須為真實地址:
network.publish_host: 192.168.0.1
18. bind_host和publish_host可以一起設(shè)置:
network.host: 192.168.0.1
19. 可以定制該節(jié)點與其他節(jié)點交互的端口:
transport.tcp.port: 9300
20. 節(jié)點間交互時,可以設(shè)置是否壓縮,轉(zhuǎn)為為不壓縮:
transport.tcp.compress: true
21. 可以為Http傳輸監(jiān)聽定制端口:
http.port: 9200
22. 設(shè)置內(nèi)容的最大長度:
http.max_content_length: 100mb
23. 禁止HTTP
http.enabled: false
24. 網(wǎng)關(guān)允許在所有集群重啟后持有集群狀態(tài),集群狀態(tài)的變更都會被保存下來,當(dāng)?shù)谝淮螁⒂眉簳r,可以從網(wǎng)關(guān)中讀取到狀態(tài),默認(rèn)網(wǎng)關(guān)類型(也是推薦的)是local:
gateway.type: local
25. 允許在N個節(jié)點啟動后恢復(fù)過程:
gateway.recover_after_nodes: 1
26. 設(shè)置初始化恢復(fù)過程的超時時間:
gateway.recover_after_time: 5m
27. 設(shè)置該集群中可存在的節(jié)點上限:
gateway.expected_nodes: 2
28. 設(shè)置一個節(jié)點的并發(fā)數(shù)量,有兩種情況,一種是在初始復(fù)蘇過程中:
cluster.routing.allocation.node_initial_primaries_recoveries: 4
另一種是在添加、刪除節(jié)點及調(diào)整時:
cluster.routing.allocation.node_concurrent_recoveries: 2
29. 設(shè)置復(fù)蘇時的吞吐量,默認(rèn)情況下是無限的:
indices.recovery.max_size_per_sec: 0
30. 設(shè)置從對等節(jié)點恢復(fù)片段時打開的流的數(shù)量上限:
indices.recovery.concurrent_streams: 5
31. 設(shè)置一個集群中主節(jié)點的數(shù)量,當(dāng)多于三個節(jié)點時,該值可在2-4之間:
discovery.zen.minimum_master_nodes: 1
32. 設(shè)置ping其他節(jié)點時的超時時間,網(wǎng)絡(luò)比較慢時可將該值設(shè)大:
discovery.zen.ping.timeout: 3s
http://elasticsearch.org/guide/reference/modules/discovery/zen.html上有更多關(guān)于discovery的設(shè)置。
33. 禁止當(dāng)前節(jié)點發(fā)現(xiàn)多個集群節(jié)點,默認(rèn)值為true:
discovery.zen.ping.multicast.enabled: false
34. 設(shè)置新節(jié)點被啟動時能夠發(fā)現(xiàn)的主節(jié)點列表(主要用于不同網(wǎng)段機器連接):
discovery.zen.ping.unicast.hosts: [“host1”, “host2:port”, “host3[portX-portY]”]
35.設(shè)置是否可以通過正則或者_(dá)all刪除或者關(guān)閉索引
action.destructive_requires_name 默認(rèn)false 允許 可設(shè)置true不允許
Elasticsearch 的工作原理是什么?
原始數(shù)據(jù)會從多個來源(包括日志、系統(tǒng)指標(biāo)和網(wǎng)絡(luò)應(yīng)用程序)輸入到 Elasticsearch 中。數(shù)據(jù)采集指在 Elasticsearch 中進(jìn)行索引之前解析、標(biāo)準(zhǔn)化并充實這些原始數(shù)據(jù)的過程。這些數(shù)據(jù)在 Elasticsearch 中索引完成之后,用戶便可針對他們的數(shù)據(jù)運行復(fù)雜的查詢,并使用聚合來檢索自身數(shù)據(jù)的復(fù)雜匯總。在 Kibana 中,用戶可以基于自己的數(shù)據(jù)創(chuàng)建強大的可視化,分享儀表板,并對 Elastic Stack 進(jìn)行管理。
Elasticsearch 索引是什么?
Elasticsearch 索引指相互關(guān)聯(lián)的文檔集合。Elasticsearch 會以 JSON 文檔的形式存儲數(shù)據(jù)。每個文檔都會在一組鍵(字段或?qū)傩缘拿Q)和它們對應(yīng)的值(字符串、數(shù)字、布爾值、日期、數(shù)值組、地理位置或其他類型的數(shù)據(jù))之間建立聯(lián)系。
Elasticsearch 使用的是一種名為倒排索引的數(shù)據(jù)結(jié)構(gòu),這一結(jié)構(gòu)的設(shè)計可以允許十分快速地進(jìn)行全文本搜索。倒排索引會列出在所有文檔中出現(xiàn)的每個特有詞匯,并且可以找到包含每個詞匯的全部文檔。
在索引過程中,Elasticsearch 會存儲文檔并構(gòu)建倒排索引,這樣用戶便可以近實時地對文檔數(shù)據(jù)進(jìn)行搜索。索引過程是在索引 API 中啟動的,通過此 API 您既可向特定索引中添加 JSON 文檔,也可更改特定索引中的 JSON 文檔。
為何使用 Elasticsearch?
Elasticsearch 很快。由于 Elasticsearch 是在 Lucene 基礎(chǔ)上構(gòu)建而成的,所以在全文本搜索方面表現(xiàn)十分出色。Elasticsearch 同時還是一個近實時的搜索平臺,這意味著從文檔索引操作到文檔變?yōu)榭伤阉鳡顟B(tài)之間的延時很短,一般只有一秒。因此,Elasticsearch 非常適用于對時間有嚴(yán)苛要求的用例,例如安全分析和基礎(chǔ)設(shè)施監(jiān)測。
Elasticsearch 具有分布式的本質(zhì)特征。Elasticsearch 中存儲的文檔分布在不同的容器中,這些容器稱為分片,可以進(jìn)行復(fù)制以提供數(shù)據(jù)冗余副本,以防發(fā)生硬件故障。Elasticsearch 的分布式特性使得它可以擴展至數(shù)百臺(甚至數(shù)千臺)服務(wù)器,并處理 PB 量級的數(shù)據(jù)。
Elasticsearch 包含一系列廣泛的功能。除了速度、可擴展性和彈性等優(yōu)勢以外,Elasticsearch 還有大量強大的內(nèi)置功能(例如數(shù)據(jù)匯總和索引生命周期管理),可以方便用戶更加高效地存儲和搜索數(shù)據(jù)。
Elastic Stack 簡化了數(shù)據(jù)采集、可視化和報告過程。通過與 Beats 和 Logstash 進(jìn)行集成,用戶能夠在向 Elasticsearch 中索引數(shù)據(jù)之前輕松地處理數(shù)據(jù)。同時,Kibana 不僅可針對 Elasticsearch 數(shù)據(jù)提供實時可視化,同時還提供 UI 以便用戶快速訪問應(yīng)用程序性能監(jiān)測 (APM)、日志和基礎(chǔ)設(shè)施指標(biāo)等數(shù)據(jù)。
Elasticsearch 提供強大且全面的 REST API 集合,這些 API 可用來執(zhí)行各種任務(wù),例如檢查集群的運行狀況、針對索引執(zhí)行 CRUD(創(chuàng)建、讀取、更新、刪除)和搜索操作,以及執(zhí)行諸如篩選和聚合等高級搜索操作。
Elasticsearch 分詞
分詞分為讀時分詞和寫時分詞。
讀時分詞發(fā)生在用戶查詢時,ES 會即時地對用戶輸入的關(guān)鍵詞進(jìn)行分詞,分詞結(jié)果只存在內(nèi)存中,當(dāng)查詢結(jié)束時,分詞結(jié)果也會隨即消失。而寫時分詞發(fā)生在文檔寫入時,ES 會對文檔進(jìn)行分詞后,將結(jié)果存入倒排索引,該部分最終會以文件的形式存儲于磁盤上,不會因查詢結(jié)束或者 ES 重啟而丟失。
寫時分詞器需要在 mapping 中指定,而且一經(jīng)指定就不能再修改,若要修改必須新建索引。
分詞一般在ES中有分詞器處理。英文為Analyzer,它決定了分詞的規(guī)則,Es默認(rèn)自帶了很多分詞器,如:
Standard、english、Keyword、Whitespace等等。默認(rèn)的分詞器為Standard,通過它們各自的功能可組合
成你想要的分詞規(guī)則。分詞器具體詳情可查看官網(wǎng):分詞器
另外,在常用的中文分詞器、拼音分詞器、繁簡體轉(zhuǎn)換插件。國內(nèi)用的就多的分別是:
- 中文: https://github.com/medcl/elasticsearch-analysis-ik/releases/
- 拼音: https://github.com/medcl/elasticsearch-analysis-pinyin/releases/
- 簡體/繁體轉(zhuǎn)換:https://github.com/medcl/elasticsearch-analysis-stconvert/releases/
可在以上鏈接找到自己對于的elasticsearch版本安裝插件。
使用javaApi連接es
maven依賴
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
</dependency>
<!--elasticsearch客戶端-->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
</dependency>
</dependencies>
索引管理
@Service
public class EsIndexOperation {
@Resource
private RestHighLevelClient client ;
private final RequestOptions options = RequestOptions.DEFAULT;
/**
* 判斷索引是否存在
*/
public boolean checkIndex (String index) {
try {
return client.indices().exists(new GetIndexRequest(index), options);
} catch (IOException e) {
e.printStackTrace();
}
return Boolean.FALSE ;
}
/**
* 創(chuàng)建索引
*/
public boolean createIndex (String indexName ,Map<String, Object> columnMap){
try {
if(!checkIndex(indexName)){
CreateIndexRequest request = new CreateIndexRequest(indexName);
if (columnMap != null && columnMap.size()>0) {
Map<String, Object> source = new HashMap<>();
source.put("properties", columnMap);
request.mapping(source);
}
this.client.indices().create(request, options);
return Boolean.TRUE ;
}
} catch (IOException e) {
e.printStackTrace();
}
return Boolean.FALSE;
}
/**
* 刪除索引
*/
public boolean deleteIndex(String indexName) {
try {
if(checkIndex(indexName)){
DeleteIndexRequest request = new DeleteIndexRequest(indexName);
AcknowledgedResponse response = client.indices().delete(request, options);
return response.isAcknowledged();
}
} catch (Exception e) {
e.printStackTrace();
}
return Boolean.FALSE;
}
}
數(shù)據(jù)管理
這里在更新數(shù)據(jù)時,可以直接修改索引結(jié)構(gòu),在dataMap中放進(jìn)新的字段即可。
@Service
public class EsDataOperation {
@Resource
private RestHighLevelClient client ;
private final RequestOptions options = RequestOptions.DEFAULT;
/**
* 寫入數(shù)據(jù)
*/
public boolean insert (String indexName, Map<String,Object> dataMap){
try {
BulkRequest request = new BulkRequest();
request.add(new IndexRequest(indexName,"doc").id(dataMap.remove("id").toString())
.opType("create").source(dataMap,XContentType.JSON));
this.client.bulk(request, options);
return Boolean.TRUE ;
} catch (Exception e){
e.printStackTrace();
}
return Boolean.FALSE;
}
/**
* 批量寫入數(shù)據(jù)
*/
public boolean batchInsert (String indexName, List<Map<String,Object>> userIndexList){
try {
BulkRequest request = new BulkRequest();
for (Map<String,Object> dataMap:userIndexList){
request.add(new IndexRequest(indexName,"doc").id(dataMap.remove("id").toString())
.opType("create").source(dataMap,XContentType.JSON));
}
this.client.bulk(request, options);
return Boolean.TRUE ;
} catch (Exception e){
e.printStackTrace();
}
return Boolean.FALSE;
}
/**
* 更新數(shù)據(jù),可以直接修改索引結(jié)構(gòu)
*/
public boolean update (String indexName, Map<String,Object> dataMap){
try {
UpdateRequest updateRequest = new UpdateRequest(indexName,"doc", dataMap.remove("id").toString());
updateRequest.setRefreshPolicy(WriteRequest.RefreshPolicy.IMMEDIATE);
updateRequest.doc(dataMap) ;
this.client.update(updateRequest, options);
return Boolean.TRUE ;
} catch (Exception e){
e.printStackTrace();
}
return Boolean.FALSE;
}
/**
* 刪除數(shù)據(jù)
*/
public boolean delete (String indexName, String id){
try {
DeleteRequest deleteRequest = new DeleteRequest(indexName,"doc", id);
this.client.delete(deleteRequest, options);
return Boolean.TRUE ;
} catch (Exception e){
e.printStackTrace();
}
return Boolean.FALSE;
}
}
查詢操作
注意:查詢總數(shù)的CountRequest語法,SearchRequest查詢結(jié)果中數(shù)據(jù)轉(zhuǎn)換語法,分頁查詢中需要指定偏移位置和分頁大小。
@Service
public class EsQueryOperation {
@Resource
private RestHighLevelClient client ;
private final RequestOptions options = RequestOptions.DEFAULT;
/**
* 查詢總數(shù)
*/
public Long count (String indexName){
// 指定創(chuàng)建時間
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("createTime", 1611378102795L));
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.query(queryBuilder);
CountRequest countRequest = new CountRequest(indexName);
countRequest.source(sourceBuilder);
try {
CountResponse countResponse = client.count(countRequest, options);
return countResponse.getCount();
} catch (Exception e) {
e.printStackTrace();
}
return 0L;
}
/**
* 查詢集合
*/
public List<Map<String,Object>> list (String indexName) {
// 查詢條件,指定時間并過濾指定字段值
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
queryBuilder.must(QueryBuilders.termQuery("createTime", 1611378102795L));
queryBuilder.mustNot(QueryBuilders.termQuery("name","北京-李四"));
sourceBuilder.query(queryBuilder);
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResp = client.search(searchRequest, options);
List<Map<String,Object>> data = new ArrayList<>() ;
SearchHit[] searchHitArr = searchResp.getHits().getHits();
for (SearchHit searchHit:searchHitArr){
Map<String,Object> temp = searchHit.getSourceAsMap();
temp.put("id",searchHit.getId()) ;
data.add(temp);
}
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
/**
* 分頁查詢
*/
public List<Map<String,Object>> page (String indexName,Integer offset,Integer size) {
// 查詢條件,指定時間并過濾指定字段值
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.from(offset);
sourceBuilder.size(size);
sourceBuilder.sort("createTime", SortOrder.DESC);
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResp = client.search(searchRequest, options);
List<Map<String,Object>> data = new ArrayList<>() ;
SearchHit[] searchHitArr = searchResp.getHits().getHits();
for (SearchHit searchHit:searchHitArr){
Map<String,Object> temp = searchHit.getSourceAsMap();
temp.put("id",searchHit.getId()) ;
data.add(temp);
}
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
五、排序方式
排序除了常規(guī)的指定字段升序降序規(guī)則之外,還可以基于原生的腳本語法,基于自定義規(guī)則排序讓一些特定的數(shù)據(jù)沉底或者置頂。
@Service
public class EsSortOperation {
@Resource
private RestHighLevelClient client ;
private final RequestOptions options = RequestOptions.DEFAULT;
/**
* 排序規(guī)則
*/
public List<Map<String,Object>> sort (String indexName) {
// 先升序時間,在倒序年齡
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.sort("createTime", SortOrder.ASC);
sourceBuilder.sort("age",SortOrder.DESC) ;
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResp = client.search(searchRequest, options);
List<Map<String,Object>> data = new ArrayList<>() ;
SearchHit[] searchHitArr = searchResp.getHits().getHits();
for (SearchHit searchHit:searchHitArr){
Map<String,Object> temp = searchHit.getSourceAsMap();
temp.put("id",searchHit.getId()) ;
data.add(temp);
}
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
/**
* 自定義排序規(guī)則
*/
public List<Map<String,Object>> defSort (String indexName) {
// 指定置換順序的規(guī)則
// [age 12-->60]\[age 19-->10]\[age 13-->30]\[age 18-->40],age其他值忽略為1
Script script = new Script("def _ageSort = doc['age'].value == 12?60:" +
"(doc['age'].value == 19?10:" +
"(doc['age'].value == 13?30:" +
"(doc['age'].value == 18?40:1)));" + "_ageSort;");
ScriptSortBuilder sortBuilder = SortBuilders.scriptSort(script,ScriptSortBuilder.ScriptSortType.NUMBER);
sortBuilder.order(SortOrder.ASC);
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
sourceBuilder.sort(sortBuilder);
SearchRequest searchRequest = new SearchRequest(indexName);
searchRequest.source(sourceBuilder);
try {
SearchResponse searchResp = client.search(searchRequest, options);
List<Map<String,Object>> data = new ArrayList<>() ;
SearchHit[] searchHitArr = searchResp.getHits().getHits();
for (SearchHit searchHit:searchHitArr){
Map<String,Object> temp = searchHit.getSourceAsMap();
temp.put("id",searchHit.getId()) ;
data.add(temp);
}
return data;
} catch (Exception e) {
e.printStackTrace();
}
return null ;
}
}
集群部署elasticsearch簡介
單臺elasticsearch提供服務(wù),往往都有最大的負(fù)載能力,超過這個閾值,服務(wù)器性能就會大大降低甚至不可用,所以生成環(huán)境中,一般都是運行在指定服務(wù)器集群中。
集群cluster:一個集群就是由一個或者多個服務(wù)器節(jié)點組織在一起,共同持有整個數(shù)據(jù),并一起提供索引和搜索服務(wù)。一個Elasticsearch集群有一個唯一的名字標(biāo)識,整個名字默認(rèn)就是elasticsearch。整個名字很重要,因為一個節(jié)點只能通過指定某個集群的名字來加入集群。文章來源:http://www.zghlxwxcb.cn/news/detail-421411.html
節(jié)點Node:集群中包含很多的服務(wù)器,一個節(jié)點就是其中的一個服務(wù)器。作為集群的一部分,它存儲數(shù)據(jù),參與集群的索引和搜索功能。一個節(jié)點也是由一個表示來決定的,一個節(jié)點可以通過配置集群名稱的方式來加入一個指定的集群文章來源地址http://www.zghlxwxcb.cn/news/detail-421411.html
到了這里,關(guān)于全文搜索引擎 Elasticsearch詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!