1、SearchAPI
ES支持兩種基本方式檢索:
-
一個是通過使用 REST request URI 發送搜索參數(uri+檢索參數)
GET bank/_search?q=*&sort=account_number:asc
-
另一個是通過使用 REST request body 來發送它們(uri+請求體)
GET bank/_search
{
"query": {
"match_all": {}
}
, "sort": [
{
"account_number": {
"order": "asc"
}
}
]
}
以上內容只是一個簡單的應用,具體的需要查看官方文檔
以下內容只是列出了一些核心功能,沒有語法說明
2、Query DSL
ElasticSearch提供了一個可以執行查詢的json風格的DSL(domain-specific language 領域特定語言)。這個被稱爲Qquery DSL。該語言非常全面,並且剛開始的時候感覺有點複雜,真正學好它的方法是從一些基礎的是示例開始的。
3、aggregations(執行聚合)
聚合提供了從數據中心分組和提取數據的能力。最簡單的聚合方法大致等於SQL GROUP BY和SQL聚合函數。在ElasticSearch中,有執行搜索返回hits(命中結果),並且同事返回聚合結果,把一個響應中的所有hits(命中結果)分隔開的能力。這是非常強大且有效的,可以執行查詢和多個聚合,並且在一次使用中得到各自的(任何一個的)返回結果,使用一次簡潔和簡化的API來避免網絡往返。
4、Mapping
映射,我們可以自定義屬性的類型,數據遷移等操作,支持的數據類型如下
5、分詞
一個tokenizer(分詞器)接收一個字符流,將之分隔爲獨立的tokens(詞元,通常是獨立的單詞),然後輸出tokens流。
例如,whitespace tokenizer遇到空白字符時分隔文本,它會將文本“Quick brown fox!” 分隔爲[Quick,brown,fox!]。
該tokenizer(分詞器)還負責記錄各個term(詞條)的順序或position位置(用於phrase短語和word proximity詞近鄰查詢),以及term(詞條)鎖代表的原始word(單詞)的start(起始)和end(結束)的character offsets(字符偏移量)(用於高亮顯示搜索的內容)。
ElasticSearch提供了很多內置的分詞器,可以用來構建custom analyzers(自定義分詞器)
使用ES內置的分詞器執行
POST _analyze
{
"analyzer": "standard",
"text": "我是中國人"
}
效果如下
{
"tokens" : [
{
"token" : "我",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<IDEOGRAPHIC>",
"position" : 0
},
{
"token" : "是",
"start_offset" : 1,
"end_offset" : 2,
"type" : "<IDEOGRAPHIC>",
"position" : 1
},
{
"token" : "中",
"start_offset" : 2,
"end_offset" : 3,
"type" : "<IDEOGRAPHIC>",
"position" : 2
},
{
"token" : "國",
"start_offset" : 3,
"end_offset" : 4,
"type" : "<IDEOGRAPHIC>",
"position" : 3
},
{
"token" : "人",
"start_offset" : 4,
"end_offset" : 5,
"type" : "<IDEOGRAPHIC>",
"position" : 4
}
]
}
它會把每一個漢字都轉換成一個詞,因爲內置的只支持英文單詞的分詞,所以我們下載支持中文的分詞器
-
安裝ik分詞器
注意:不能用默認elasticsearch-plugin install xxx.zip 進行自動安裝
我們打開github,找到對應版本的分詞器,網址如下
https://github.com/medcl/elasticsearch-analysis-ik/releases
找到我們對應的版本號 7.4.2進行下載
解壓到我們安裝ES的plugins文件中,切換到/mydata/elasticsearch/plugins目錄
#創建一個目錄,存放下載來的分詞器文件 mkdir elasticsearch-analysis-ik #解壓zip文件到 elasticsearch-analysis-ik 目錄 unzip elasticsearch-analysis-ik-7.4.2.zip -d elasticsearch-analysis-ik # 重啓elasticsearch docker restart elasticsearch
-
在kibana中進行測試
POST _analyze { "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 }, { "token" : "中國人", "start_offset" : 2, "end_offset" : 5, "type" : "CN_WORD", "position" : 2 }, { "token" : "中國", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 3 }, { "token" : "國人", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 4 } ] }
這個效果也不是太好,沒有按照我們想要的分詞來進行分詞,所以我們可以自定義分詞器
-
自定義詞庫
-
首先我們把ES的內存調整的大一點
#先停止ES
docker stop elasticsearch
#移除ES
docker rm elasticsearch
#然後執行以下命令
docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-e "discovery.type=single-node" \
-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \
-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \
-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \
-d elasticsearch:7.4.2
-
接着安裝nginx
-
隨便啓動一個nginx實例,只是爲了複製出配置文件
#創建nginx文件夾
cd /mydata
mkdir nginx
#創建nginx鏡像
docker run -p 80:80 --name nginx -d nginx:1.10- 將容器內的配置文件拷貝到/mydata的目錄 ```shell #需要注意後面的. docker container cp nginx:/etc/nginx .
-
修改文件名稱
#把nginx文件夾修改爲conf文件夾 mv nginx conf #然後重新創建一個nginx文件夾 mkdir nginx #把conf文件夾移動到nginx文件夾下 mv conf nginx/
-
終止原容器
docker stop nginx
-
執行命令刪除原容器
docker rm nginx
-
創建新的nginx,執行以下命令
docker run -p 80:80 --name nginx \ -v /mydata/nginx/html:/usr/share/nginx/html \ -v /mydata/nginx/logs:/var/log/nginx \ -v /mydata/nginx/conE:/etc/nginx \ -d nginx:1.10
-
找到nginx/html目錄
#切換到html目錄 cd /mydata/nginx/html #創建一個目錄,用於存放es相關的內容 mkdir es #進入es目錄 cd es #創建一個txt文件,用於存放我們分詞的數據 vi fenci.txt
-
打開文件後,編譯以下內容
我是 中國人
-
讓nginx隨系統一起啓動
docker update nginx --restart=always
-
修改/mydata/elasticsearch/plugins/elasticsearch-analysis-ik/config/中的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"></entry> <!--用戶可以在這裏配置自己的擴展停止詞字典--> <entry key="ext_stopwords"></entry> <!--用戶可以在這裏配置遠程擴展字典,主要修改下面這一行爲我們配置的nginx地址+分詞文件路徑 --> <entry key="remote_ext_dict">http://192.168.56.10/es/fenci.txt</entry> <!--用戶可以在這裏配置遠程擴展停止詞字典--> <!-- <entry key="remote_ext_stopwords">words_location</entry> --> </properties>
-
重啓ES
docker restart elsaticsearch
#效果如下,我是 中國人 { "tokens" : [ { "token" : "我是", "start_offset" : 0, "end_offset" : 2, "type" : "CN_WORD", "position" : 0 }, { "token" : "中國人", "start_offset" : 2, "end_offset" : 5, "type" : "CN_WORD", "position" : 1 }, { "token" : "中國", "start_offset" : 2, "end_offset" : 4, "type" : "CN_WORD", "position" : 2 }, { "token" : "國人", "start_offset" : 3, "end_offset" : 5, "type" : "CN_WORD", "position" : 3 } ] }
-
是不是很好玩呢?看到這裏說明你已經有了一定的ES基礎了,下面我們在程序中使用ES提供的功能