lucene、Solr、Elasticsearchhtml
一、倒排序索引java
二、Lucene是類庫node
三、solr基於lucenelinux
四、ES基於lucenegit
一、es能夠支持空格查詢,多個關鍵字 二、空格支持 三、拆詞查詢 四、搜索內容能夠高亮 五、海量數據查庫
stu_index { id: 1001, name: jason, age: 19 }, { id: 1002, name: tom, age: 18 }, { id: 1003, name: rose, age: 22 }
shard = primary shard(主分片)
replica = replica shard(備份節點)github
加入有3TB的數據那麼ES向上面的架構模型,每一個shard會承擔1TB的數據,當一個ES的shard出現故障,那麼它的replica就會成爲它的角色。redis
A、index包含多個shard 數據庫
B、每一個shard都是一個最小工做單元,承載部分數據,lucene實例,完整地創建索引和處理請求的能力 json
C、增長或減小節點時,shard會自動地在node中負載均衡 vim
D、primary shard和replica shard,每一個document確定只存在於某一個primary shard以及其對應的replica shard 中,不可能存在於多個primary shard
E、replica shard是primary shard 的副本,負責容錯以及承擔讀請求負載
F、primary shard的數量在建立索引的時候就固定了,replica shard的數量能夠隨時修改
G、primary shard不能和本身的replica shard放在同一節點上,可是能夠和其它primary shard放在同一節點上
一、索引方式的區別,es主要是利用倒排索引(inverted index),這個翻譯可能會讓初次接觸的人產生誤解,誤覺得是倒着排序?其實不是這樣,通常關係型數據庫索引是把某個字段創建起一張索引表,傳入這個字段的某個值,再去索引中判斷是否有這個值,從而找到這個值所在數據(id)的位置。而倒排索引則是把這個值所在的文檔id記錄下來,當輸入這個值的時候,直接查詢出這個值所匹配的文檔id,再取出id。因此咱們在創建es索引的時候,有分詞的概念,至關於能夠把filed字段內容拆分,而後索引記錄下來。例如「我愛中國」,能夠拆分紅「我」,「愛」,「中國」,「我愛中國」這五個詞,同時記錄下來這幾個關鍵詞的對應文檔數據id是1,當咱們查詢「我」,「中國」時,都能查出這條數據。而若是使用關係型數據庫去查包含「中國」這個關鍵字的數據的時候,則須要like先後通配全表掃描,沒法快速找到關鍵詞所在的數據行。
二、倒排索引是不可更改的,一旦它被創建了,裏面的數據就不會再進行更改。這樣作就帶來了如下幾個好處:
如圖左邊爲存儲結構,右邊爲倒排索引,將左邊的每條文檔值內容進行分詞而且記錄詞頻和位置,好比咱們如今搜索「集羣」兩字就會直接按照文檔ids進行搜索,獲得文檔一、二、3條記錄,搜索「學習」會獲得文檔一、3兩條記錄。
官網下載太慢,直接使用我下載好的安裝包
連接:https://pan.baidu.com/s/1Na0K7hIFJbGECD9XCwdR4A 提取碼:9oz6 複製這段內容後打開百度網盤手機App,操做更方便哦
tar -zxvf elasticsearch-7.10.1-linux-x86_64.tar.gz
mv elasticsearch-7.10.1 /usr/local
cd /usr/local/elasticsearch-7.10.1 ll
bin:可執行文件在裏面,運行es的命令就在這個裏面,包含了一些腳本文件等
config:配置文件目錄
JDK:java環境
lib:依賴的jar,類庫
logs:日誌文件
modules:es相關的模塊
plugins:能夠本身開發的插件
data:這個目錄沒有,本身新建一下,後面要用 -> mkdir data,這個做爲索引目錄
5.綁定es網絡ip,原理同redis
6.默認端口號9200,能夠自定義修改
7.集羣節點,名字能夠先改爲以前的那個節點名稱
默認xms和xmx都是1g,我使用的是虛擬機內存沒這麼大,修改一下便可
vim jvm.options
ES不容許使用root操做es,須要添加用戶,操做以下:
useradd esuser chown -R esuser:esuser /usr/local/elasticsearch-7.4.2 whoami
vim /etc/security/limits.conf
在尾部添加以下內容
* soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096
2. 修改 sysctl.conf 文件
vim /etc/sysctl.conf
在下面添加以下內容
vm.max_map_count=262145
su esuser
2. 到ES的bin目錄下面
cd /usr/local/elasticsearch-7.10.1/bin
3.啓動
./elasticsearch ## 前臺啓動
./elasticsearch -d ## 後臺啓動
在瀏覽器輸入 虛擬器IP + ES端口號
9200:Http協議,用於外部通信
9300:Tcp協議,ES集羣之間是經過9300通信
http://192.168.2.223:9200/
成功
github地址:https://github.com/mobz/elasticsearch-head
爲方便起見我使用Google插件進行安裝,備註:須要能谷歌上網
安裝完成後以下所示爲用ES-Header查看咱們剛纔安裝後的ES節點信息:
在 elasticearch.yml 中加入以下內容便可:
http.cors.enabled: true http.cors.allow-origin: "*"
五、ES文檔的基本操做--增刪改查
http://192.168.2.223:9200/my_doc/_doc/1 { "id": 1001, "name": "zhouhong-1", "desc": "zhouhong is my good fridend!", "create_date": "2021-02-19" } http://192.168.2.223:9200/my_doc/_doc/2 { "id": 1002, "name": "zhouhong-2", "desc": "zhouhong 是一個好人", "create_date": "2021-02-18" } http://192.168.2.223:9200/my_doc/_doc/3 { "id": 1003, "name": "zhouhong-3", "desc": "zhouhong 真的是一個好人", "create_date": "2021-02-18" } http://192.168.2.223:9200/my_doc/_doc/4 { "id": 1004, "name": "zhouhong-4", "desc": "zhouhong is her friend", "create_date": "2021-02-18" } http://192.168.2.223:9200/my_doc/_doc/5 { "id": 1005, "name": "zhouhong-5", "desc": "zhouhong is 好人", "create_date": "2021-02-18" } http://192.168.2.223:9200/my_doc/_doc/6 { "id": 1006, "name": "zhouhong-6", "desc": "zhouhong is realy good man", "create_date": "2021-02-18" }
{ "doc": { "name" "周紅" } }
{ "_index": "my_doc", "_type": "_doc", "_id": "6", "_version": 2, "_seq_no": 17, "_primary_term": 1, "found": true, "_source": { "id": 1006, "name": "zhouhong-6", "desc": "zhouhong is realy good man", "create_date": "2021-02-18" } }
六、ES分詞器
ES默認只支持英文分詞,若是是中文它會拆分爲一個一個字
{ "analyzer": "standard", "text": "zhouhong is a good man!" }
{ "tokens": [ { "token": "zhouhong", "start_offset": 0, "end_offset": 8, "type": "<ALPHANUM>", "position": 0 }, { "token": "is", "start_offset": 9, "end_offset": 11, "type": "<ALPHANUM>", "position": 1 }, { "token": "a", "start_offset": 12, "end_offset": 13, "type": "<ALPHANUM>", "position": 2 }, { "token": "good", "start_offset": 14, "end_offset": 18, "type": "<ALPHANUM>", "position": 3 }, { "token": "man", "start_offset": 19, "end_offset": 22, "type": "<ALPHANUM>", "position": 4 } ] }
unzip elasticsearch-analysis-ik-7.10.1.zip -d /usr/local/elasticsearch-7.10.1/plugins/ik
{ "analyzer": "ik_max_word", "text": "明天早上吃什麼呢" }
{ "tokens": [ { "token": "明天", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 0 }, { "token": "早上", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 1 }, { "token": "吃什麼", "start_offset": 4, "end_offset": 7, "type": "CN_WORD", "position": 2 }, { "token": "什麼", "start_offset": 5, "end_offset": 7, "type": "CN_WORD", "position": 3 }, { "token": "呢", "start_offset": 7, "end_offset": 8, "type": "CN_CHAR", "position": 4 } ] }
{ "analyzer": "ik_smart", "text": "明天早上吃什麼呢" }
{ "tokens": [ { "token": "明天", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 0 }, { "token": "早上", "start_offset": 2, "end_offset": 4, "type": "CN_WORD", "position": 1 }, { "token": "吃什麼", "start_offset": 4, "end_offset": 7, "type": "CN_WORD", "position": 2 }, { "token": "呢", "start_offset": 7, "end_offset": 8, "type": "CN_CHAR", "position": 3 } ] }
{ "analyzer": "ik_max_word", "text": "周紅" } { "tokens": [ { "token": "周", "start_offset": 0, "end_offset": 1, "type": "CN_CHAR", "position": 0 }, { "token": "紅", "start_offset": 1, "end_offset": 2, "type": "CN_CHAR", "position": 1 } ] }
vim /usr/local/elasticsearch-7.10.1/plugins/ik/config/IKAnalyzer.cfg.xml
{ "analyzer": "ik_max_word", "text": "周紅" }
{ "tokens": [ { "token": "周紅", "start_offset": 0, "end_offset": 2, "type": "CN_WORD", "position": 0 } ] }
後面若是想擴展,只需在自定義的custom.dic裏面添加詞彙便可