ElasticSearch完成最關鍵的一個功能就是 大數據搜索
官網:https://www.elastic.co/cn/elasticsearch/
簡介
Elasticsearch 是一個分布式全文檢索引擎
Lucene、Solr、ElasticSearch
- Lucene
- 是一套信息搜索工具jar包
- 包括了:索引結構、讀寫索引的工具、排序、搜索規則等等工具類
- 注意:不包括搜索引擎系統
- Solr
- 是基於Lucene做了一些封裝和增強
- 通過對外提供Web-service的API接口
- ElasticSearch
- 是基於Lucene做了一些封裝和增強
- 通過簡單的Restful來隱藏Lucene的復雜性
安裝
windows安裝es
環境:jdk1.8及以上
在官網中可以進行下載,但是因為是外網,速度是極其的慢。而且可能安裝失敗,所以我們可以通過官網找到你要下載的版本,然后通過華為雲鏡像去下載。(下方鏈接)
ElasticSearch: https://mirrors.huaweicloud.com/elasticsearch/?C=N&O=D
在windows上安裝es,很方便解壓即可使用
解壓的目錄結構如下
bin 啟動文件
config 配置文件
log4j 日志配置文件
jvm.options java虛擬機相關配置
elasticsearch.yml es配置文件 默認:9200端口
lib 相關jar包
log 日志
modules 功能模塊
plugins 插件 比如ik分詞器
啟動
雙擊bin\elasticsearch.bat
在網頁中就可以訪問 http://localhost:9200/
安裝可視化界面 elasticsearch-head
除了下面的安裝方法,你也可以在谷歌瀏覽器中安裝插件elasticsearch head
環境:nodejs
下載地址:https://github.com/mobz/elasticsearch-head
下載完成后,盡量將ElasticSearch相關工具放在統一目錄下
cd elasticsearch-head #到路徑下
npm install -g nrm #全局安裝nrm 如果沒有安裝過安裝一下
nrm use taobao #切換鏡像
npm install #安裝依賴
npm run start #啟動項目
啟動
在網頁中就可以訪問 http://localhost:9200/
但是,出現了跨域問題
在elasticsearch.yml
文件中配置,解決跨域。注意由於yml的格式問題,冒號后面需要加空格。
修改好配置文件之后重新啟動elasticsearch
http.cors.enabled: true
http.cors.allow-origin: "*"
安裝kibana
kibana可以將elasticsearch的數據通過友好的界面展示出來,提供實時的分析功能。
官網下載慢,和elasticsearch一樣的解決方法,華為雲鏡像:https://mirrors.huaweicloud.com/kibana/?C=N&O=D
注意:需要保證版本和elasticsearch的版本一致
下載完成后,盡量將ElasticSearch相關工具放在統一目錄下
啟動
雙擊bin目錄下的kibana.bat
如果說,你在英文方面不太擅長,kibana是支持漢化的
編輯器打開kibana解壓目錄/config/kibana.yml
,添加如下,然后沖洗kibana
i18n.locale: "zh-CN"
直接修改配置就可以實現漢化的原因是在kibana-7.10.0-windows-x86_64\x-pack\plugins\translations\translations
中存在了zh-CN.json
ES核心概念
elasticsearch是面向文檔。一切都是json。
傳統的關系型數據庫和elasticsearch進行對比
DB | ElasticSearch |
---|---|
數據庫 database | 索引 indices |
表 tables | types |
行 rows | 文檔 documents |
字段 columns | fields |
elasticsearch中可以包含多個索引(數據庫),每個索引中可以包含多個類型(表),每個類型下又包含多個文檔(行),每個文檔中又包含多個字段(列)。
IK分詞器
分詞:即把一段中文或者別的划分成一個個的關鍵字,默認的中文分詞是將每個字看成一個詞(不使用用IK分詞器的情況下)。但是,這顯然是不符合要求的,所以我們需要安裝中文分詞器ik來解決這個問題。
IK提供了兩個分詞算法: ik_smart
和ik_max_word
,其中ik_smart
為最少切分, ik_max_word
為最細粒度划分!
下載
版本要與ElasticSearch版本對應
下載地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
安裝
加壓即可(但是我們需要解壓到ElasticSearch的plugins目錄下),然后壓縮包進行刪除
重啟elasticsearch,可以看到加載了插件
測試
使用kibana的開發工具進行測試,注意:kibana開發工具執行的時候,需要將鼠標選中當前行,然后點擊運行
從上面的例子中,感覺分詞都比較正常,但是大多數,分詞都滿足不了我們的想法,如下例
那么,我們需要手動將該詞添加到分詞器的詞典當中
添加自定義的詞添加到擴展字典中
elasticsearch目錄/plugins/elasticsearch-analysis-ik-7.10.0/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>
<!--用戶可以在這里配置遠程擴展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用戶可以在這里配置遠程擴展停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
將擴展字典進行修改,然后在和IKAnalyzer.cfg.xml
的相同目錄下,新建一個my.dic
,添加字典
<!--用戶可以在這里配置自己的擴展字典 -->
<entry key="ext_dict">my.dic</entry>
重啟ElasticSearch,再次使用kibana測試
可以看到加載了my.dic
Rest風格
基本Rest命令說明
method | url地址 | 描述 |
---|---|---|
PUT(創建,修改) | localhost:9200/索引名稱/類型名稱/文檔id | 創建文檔(指定文檔id) |
POST(創建) | localhost:9200/索引名稱/類型名稱 | 創建文檔(隨機文檔id) |
POST(修改) | localhost:9200/索引名稱/類型名稱/文檔id/_update | 修改文檔 |
DELETE(刪除) | localhost:9200/索引名稱/類型名稱/文檔id | 刪除文檔 |
GET(查詢) | localhost:9200/索引名稱/類型名稱/文檔id | 查詢文檔通過文檔ID |
POST(查詢) | localhost:9200/索引名稱/類型名稱/文檔id/_search | 查詢所有數據 |
基本操作
1、創建一個索引,添加
PUT /test1/type1/1
{
"name":"DJ同學",
"age":22
}
2、字段數據類型
- 字符串類型:text、keyword
- 數值型:long、Integer、short、byte、double、float、half float、scaled float
- 日期類型:date
- 布爾類型:boolean
- 二進制類型:binary
- ...
3、指定字段的類型(使用PUT)
類似於建庫(建立索引和字段對應類型),也可看做規則的建立
PUT /test2
{
"mappings":{
"properties":{
"name":{
"type":"text"
},
"age":{
"type":"long"
},
"birthday":{
"type":"date"
}
}
}
}
4、獲取3建立的規則
GET test2
5、獲取默認信息
_doc
默認類型(default type),type 在未來的版本中會逐漸棄用,因此產生一個默認類型進行代替
PUT /test3/_doc/1
{
"name":"DJ同學",
"age":22,
"birthday":"2021-01-01"
}
GET test3
7、刪除
刪除索引 DELETE /索引名/~類型名~/文檔id
根據需求來判斷是刪除索引還是刪除文檔記錄!
DELETE test1
8、新增數據
PUT /test4/user/1
{
"name":"張三",
"grade":"大一"
}
9、修改數據
你可以使用put的創建命令,直接覆蓋。下面提供了最新的修改方法
POST /test4/user/3/_update
{
"doc":{
"name":"趙四"
}
}
10、簡單查詢數據
GET /test4/user/2
GET /test4/user/_search?q=name:"張三"
11、復雜的查詢select(排序,分頁,高亮,模糊查詢,精准查詢)
test4索引中的內容如下
查詢匹配
- sort 只能用於數字類型,而且所有的score會變成null
- _source 過濾字段,默認顯示所有字段
GET /test4/user/_search
{
"query":{
"match": {
"name":"三三"
}
}
,"_source": ["name","desc"]
,"sort":[
{
"age":{
"order":"asc"
}
}]
,"from": 0
,"size": 1
}
多條件查詢(bool)
must
相當於and
should
相當於or
must_not
相當於not (... and ...)
filter
過濾
GET /test4/user/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"三"
}
}
,
{
"match":{
"age":9
}
}
]
}
}
}
GET /test4/user/_search
{
"query":{
"bool":{
"must":[
{
"match":{
"name":"三"
}
}
]
,"filter":{
"range": {
"age": {
"gte": 0,
"lte": 20
}
}
}
}
}
}
精確查詢
term
直接通過 倒排索引 指定詞條查詢- 適合查詢 number、date、keyword ,不適合text
GET /test4/user/_search
{
"query": {
"term": {
"name":"張三"
}
}
}
高亮查詢
GET test4/user/_search
{
"query": {
"match": {
"name":"張三"
}
}
,
"highlight": {
"fields": {
"name": {}
}
}
}
// 自定義前綴和后綴
GET test4/user/_search
{
"query": {
"match": {
"name":"張三"
}
}
,
"highlight": {
"pre_tags": "<p class='key' style='color:red'>",
"post_tags": "</p>",
"fields": {
"name": {}
}
}
}
集成springboot
Java High Level REST Client 高級客戶端api測試
官網學習api:https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.x/java-rest-high.html
包括了索引和文檔的CRUD,代碼es-api https://gitee.com/dz138598/elasticsearch-study/tree/master/
實戰
代碼:https://gitee.com/dz138598/elasticsearch-study/tree/master/jd-project