說明:本篇文章主要是經過springboot整合es的基本使用基礎,詳細瞭解的能夠看我上一篇文章:全文搜索-ElasticSearchhtml
有朋友私信我上一篇沒有環境搭建方面的,這裏給你細說一下。java
官方文檔node
Elasticsearch是一個開源的搜索引擎,創建在一個全文搜索引擎庫Apache Lucene™基礎之上。 Lucene能夠說是當下最早進,高性能,全功能的搜索引擎庫 - 不管是開源仍是私有。mysql
可是Lucene僅僅是一個庫。爲了充分發揮其功能,你須要使用Java並將Lucene直接集成到應用程序中。更糟糕的是,您可能須要得到信息檢索學位才能瞭解其工做原理.Lucene 很是複雜。linux
Elasticsearch也是使用Java編寫的,它的內部使用Lucene作索引與搜索,可是它的目的是使用全文檢索變得簡單,經過隱藏Lucene的複雜性,取而代之的提供一套簡單一致的RESTful API。git
然而,Elasticsearch不只僅是Lucene,而且也不只僅是一個全文搜索引擎。 它能夠被下面這樣準確的形容:github
Elasticsearch將全部的功能打包成一個單獨的服務,這樣你能夠經過程序與它提供的簡單的RESTful API進行通訊,可使用本身喜歡的編程語言充當web客戶端,甚至可使用命令行(去充當這個客戶端)。web
就Elasticsearch而言,起步很簡單。對於初學者來講,它預設了一些適當的默認值,並隱藏了複雜的搜索理論知識。它開箱即用。只需最少的理解,你很快就能具備生產力。spring
Elasticsearch是文件存儲,Elasticsearch是面向文檔型數據庫,一條數據在這裏就是一個文檔,用JSON做爲文檔序列化的格式,好比下面這條用戶數據:sql
{ "name" : "hello world", "sex" : 0, "email": "10086@qq.com" "age" : 20 }
關係數據庫 ⇒ 數據庫(database) ⇒ 表(table) ⇒ 行 (row) ⇒ 列(Columns)
Elasticsearch ⇒索引(index) ⇒類型(type) ⇒文檔(docments) ⇒字段(fields)
Elasticsearch能夠存放大量數據,Elasticsearch集羣很是容易橫向擴展,並且檢索性能很是好,在大數據量的狀況下相比於mysql等性能上有很大的優點,下面的幾個優點:
**橫向可擴展性:**只須要增長臺服務器或者添加節點,在分佈式配置中心更新配置,啓動Elasticsearch的服務器就能夠併入集羣。
**分片機制提供更好的分佈性:**同一個索引分紅多個分片(sharding), 這點相似於分佈式文件系統的塊機制;分而治之的方式可提高處理效率。
**高可用:**提供複製( replica) 機制,一個分片能夠設置多個複製,使得某臺服務器在宕機的狀況下,集羣仍舊能夠照常運行,並會把服務器宕機丟失的數據信息複製恢復到其餘可用節點上。
使用簡單:只需一條命令就能夠下載文件,而後很快就能搭建一一個站內搜索引擎。
Elasticsearch | solr | |
---|---|---|
優勢 | Elasticsearch是分佈式的。不須要其餘組件,分發是實時的,被叫作」Push replication」。Elasticsearch 徹底支持 Apache Lucene 的接近實時的搜索。處理多租戶不須要特殊配置,而Solr則須要更多的高級設置。Elasticsearch 採用 Gateway 的概念,使得完備份更加簡單。各節點組成對等的網絡結構,某些節點出現故障時會自動分配其餘節點代替其進行工做。 | Solr有一個更大、更成熟的用戶、開發和貢獻者社區。支持添加多種格式的索引,如:HTML、PDF、微軟 Office 系列軟件格式以及 JSON、XML、CSV 等純文本格式。Solr比較成熟、穩定。不考慮建索引的同時進行搜索,速度更快。 |
缺點 | 只有一名開發者(當前Elasticsearch GitHub組織已經不僅如此,已經有了至關活躍的維護者)還不夠自動(不適合當前新的Index Warmup API) | 創建索引時,搜索效率降低,實時索引搜索效率不高。 |
對於兩個全文索引的框架,得考慮系統架構、技術選型、人員等等方面的因素進行對比使用
後期會更新關於solr的文章
elasticsearch默認運行內存爲1G,最好設置初始化內存和最大內存
安裝JDK1.8以上環境
這裏使用Elasticsearch的版本是6.4.3,同時使用kibana可視化工具使用,對elasticsearch-head感興趣的能夠download使用
docker pull elasticsearch:6.4.3 docker pull mobz/elasticsearch-head:5 docker pull kibana:6.4.3
docker run -it --name elasticsearch -d -p 9200:9200 -p 9300:9300 -p 5601:5601 -e ES_JAVA_OPTS="-Xms256m -Xmx256m" elasticsearch:6.4.3
注意事項
kibana的container共用elasticsearch的網絡
elasticsearch服務有跨域問題,致使elasticsearch-head沒法鏈接到ES,所以須要進入ES容器修改配置
docker exec -it elasticsearch /bin/bash vi config/elasticsearch.yml 加入跨域配置 http.cors.enabled: true http.cors.allow-origin: "*"
退出容器:exit
docker restart elasticsearch
docker run -it -d -e ELASTICSEARCH_URL=http://ip:9200 --name kibana --network=container:elasticsearch kibana:6.4.3
docker run -it --name elasticsearch-head -d -p 9100:9100 docker.io/mobz/elasticsearch-head:5
一、 安裝JDK環境變量
export JAVA_HOME=/usr/local/jdk1.8.0_181 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar source /etc/profile
二、 下載elasticsearch安裝包
下載elasticsearch安裝包
注意:linux安裝內存建議1g內存以上
三、 上傳elasticsearch安裝包(這裏使用xshell 與 xshell ftp)
四、 解壓elasticsearch
tar -zxvf elasticsearch-6.4.3.tar.gz
五、 修改elasticsearch.yml
network.host: 對應本地ip
http.port: 9200
六、啓動elasticsearch報錯
cd /usr/local/elasticsearch-6.4.3/bin ./elasticsearch
可能出現的錯誤:
這裏出現的錯誤借鑑網絡
報錯1:can not run elasticsearch as root 解決方案: 由於安全問題elasticsearch 不讓用root用戶直接運行,因此要建立新用戶 第一步:liunx建立新用戶,而後給建立的用戶加密碼,輸入兩次密碼。 第二步:切換剛纔建立的用戶,而後執行elasticsearch,會顯示Permission denied 權限不足。 第三步:給新建的用戶賦權限,chmod 777 * 這個不行,由於這個用戶自己就沒有權限,確定本身不能給本身付權限。因此要用root用戶登陸付權限。 第四步:root給用戶賦權限,chown -R XXX /你的elasticsearch安裝目錄。 而後執行成功。 下面一些操做: groupadd user_group useradd username-g user_group -p 123456 chown -R username:user_group elasticsearch-6.4.3 chown -R username:user_group 切換用戶: su username ./elasticsearch 報錯2: bootstrap checks failed max virtual memory areas vm.max_map_count [65530] is vi /etc/sysctl.conf vm.max_map_count=655360 sysctl -p ./elasticsearch 報錯3: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] vi /etc/security/limits.conf * soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096 重啓服務器便可 記得,這個很重要。 ./elasticsearch
七、訪問elasticsearch
關閉防火牆,能夠的話設置永久關閉防火牆,自行百度
systemctl stop firewalld.service
中途可能會出現不少坑,記得當心,我搭建卻是沒有這麼多問題,我朋友的就出現了挺多的
一、下載
二、上傳,解壓
tar -zxvf kibana-6.4.3-linux-x86_64.tar.gz
三、配置
vim config/kibana.yml # 將默認配置改爲以下: server.port: 5601 server.host: "你的ip" #elasticsearch的服務 elasticsearch.url: "http:// 你的ip:9200"
四、啓動Kibana
./bin/kibana
五、運行
GET _search { "query": { "match_all": {} } } # 索引index 類型type 文檔document 屬性field PUT /gitboy/user/1 { "name":"hello", "sex":1, "age":22 } PUT /gitboy/user/2 { "name":"hello2", "sex":1, "age":22 } GET /gitboy/user/1
基本索引的命令以及操做能夠借鑑我上一篇文章
新建工程什麼的就不說了,直接來吧!
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
spring: data: elasticsearch: ####集羣名稱 cluster-name: elasticsearch ####地址 cluster-nodes: 139.196.81.0:9300
@Document(indexName = "cluster_name索引", type = "user")//注意cluster_name索引 @Data public class UserEntity { @Id private String id; private String name; private int sex; private int age; }
public interface UserReposiory extends CrudRepository<UserEntity, String> { }
public interface UserService { public UserEntity addUser( UserEntity user); public Optional<UserEntity> findUser(String id); } @Service public class UserServiceImpl implements UserService { @Autowired private UserReposiory userReposiory; @Override public UserEntity addUser(UserEntity user) { return userReposiory.save(user); } @Override public Optional<UserEntity> findUser(String id) { return userReposiory.findById(id); } }
@RestController public class UserController { @Autowired private UserService userService; @RequestMapping("/addUser") public UserEntity addUser(@RequestBody UserEntity user) { return userService.save(user); } @RequestMapping("/findUser") public Optional<UserEntity> findUser(String id) { return userService.findById(id); } }
@SpringBootApplication @EnableElasticsearchRepositories(basePackages = "com.example.repository") public class AppEs { public static void main(String[] args) { SpringApplication.run(AppEs.class, args); } }
由於Elasticsearch中默認的標準分詞器分詞器對中文分詞不是很友好,會將中文詞語拆分紅一個一箇中文的漢子。所以引入中文分詞器-es-ik插件
下載地址: https://github.com/medcl/elasticsearch-analysis-ik/releases
注意: es-ik分詞插件版本必定要和es安裝的版本對應
第一步:下載es的IK插件(資料中有)命名改成ik插件 第二步: 上傳到/usr/local/elasticsearch-6.4.3/plugins 第三步: 重啓elasticsearch便可
在/usr/local/elasticsearch-6.4.3/plugins/ik/config目錄下
vi custom/new_word.dic 吃雞 王者榮耀 碼雲 馬雲
3.2 配置
vi IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 擴展配置</comment> <!--用戶能夠在這裏配置本身的擴展字典 --> <entry key="ext_dict">custom/new_word.dic</entry> <!--用戶能夠在這裏配置本身的擴展中止詞字典--> <entry key="ext_stopwords"></entry> <!--用戶能夠在這裏配置遠程擴展字典 --> <!-- <entry key="remote_ext_dict">words_location</entry> --> <!--用戶能夠在這裏配置遠程擴展中止詞字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
已經把ElasticSearch的核心概念和關係數據庫作了一個對比,索引(index)至關於數據庫,類型(type)至關於數據表,映射(Mapping)至關於數據表的表結構。ElasticSearch中的映射(Mapping)用來定義一個文檔,能夠定義所包含的字段以及字段的類型、分詞器及屬性等等。
文檔映射就是給文檔中的字段指定字段類型、分詞器。
使用GET /gitboy/user/_mapping
咱們知道,在關係數據庫中,須要事先建立數據庫,而後在該數據庫實例下建立數據表,而後才能在該數據表中插入數據。而ElasticSearch中不須要事先定義映射(Mapping),文檔寫入ElasticSearch時,會根據文檔字段自動識別類型,這種機制稱之爲動態映射。
在ElasticSearch中也能夠事先定義好映射,包含文檔的各個字段及其類型等,這種方式稱之爲靜態映射。
符串:string,string類型包含 text 和 keyword。
text:該類型被用來索引長文本,在建立索引前會將這些文本進行分詞,轉化爲詞的組合,創建索引;容許es來檢索這些詞,text類型不能用來排序和聚合。
keyword:該類型不須要進行分詞,能夠被用來檢索過濾、排序和聚合,keyword類型自讀那隻能用自己來進行檢索(不可用text分詞後的模糊檢索)。
注意: keyword類型不能分詞,Text類型能夠分詞查詢
數指型:long、integer、short、byte、double、float
日期型:date
布爾型:boolean
二進制型:binary
數組類型(Array datatype)
地理座標類型(Geo-point datatype):geo_point 用於經緯度座標
地理形狀類型(Geo-Shape datatype):geo_shape 用於相似於多邊形的複雜形狀
Pv4 類型(IPv4 datatype):ip 用於IPv4 地址
Completion 類型(Completion datatype):completion 提供自動補全建議
Token count 類型(Token count datatype):token_count 用於統計作子標記的字段的index數目,該值會一直增長,不會由於過濾條件而減小
mapper-murmur3 類型:經過插件,能夠經過_murmur3_來計算index的哈希值
附加類型(Attachment datatype):採用mapper-attachments插件,可支持_attachments_索引,例如 Microsoft office 格式,Open Documnet 格式, ePub,HTML等
Analyzer 索引分詞器,索引建立的時候使用的分詞器 好比ik_smart
Search_analyzer 搜索字段的值時,指定的分詞器
正排表是以文檔的ID爲關鍵字,表中記錄文檔中每一個字的位置信息,查找時掃描表中每一個文檔中字的信息直到找出全部包含查詢關鍵字的文檔。
這種組織方法在創建索引的時候結構比較簡單,創建比較方便且易於維護;由於索引是基於文檔創建的,如果有新的文檔加入,直接爲該文檔創建一個新的索引塊,掛接在原來索引文件的後面。如果有文檔刪除,則直接找到該文檔號文檔對應的索引信息,將其直接刪除。可是在查詢的時候需對全部的文檔進行掃描以確保沒有遺漏,這樣就使得檢索時間大大延長,檢索效率低下。
儘管正排表的工做原理很是的簡單,可是因爲其檢索效率過低,除非在特定狀況下,不然實用性價值不大。
倒排表以字或詞爲關鍵字進行索引,表中關鍵字所對應的記錄表項記錄了出現這個字或詞的全部文檔,一個表項就是一個字表段,它記錄該文檔的ID和字符在該文檔中出現的位置狀況。
因爲每一個字或詞對應的文檔數量在動態變化,因此倒排表的創建和維護都較爲複雜,可是在查詢的時候因爲能夠一次獲得查詢關鍵字所對應的全部文檔,因此效率高於正排表。在全文檢索中,檢索的快速響應是一個最爲關鍵的性能,而索引創建因爲在後臺進行,儘管效率相對低一些,但不會影響整個搜索引擎的效率。
正排索引是從文檔到關鍵字的映射(已知文檔求關鍵字),倒排索引是從關鍵字到文檔的映射(已知關鍵字求文檔)。