文章目錄
-
-
- ElasticSearch 簡介
- 下載下傳并運作ElasticSearch
- 在Windows上運作ElasticSearch
- 安裝ik中文分詞器
- ik測試使用
- 安裝ElasticSearch的Head插件
- Linux安裝ElasticSearch
- java中使用elastaicsearch(RestHighLevelClient)
-
ElasticSearch 簡介
ElasticSearch是一個高度可擴充的開源搜尋引擎并使用REST API,是以您值得擁有。 在本教程中,将介紹開始使用ElasticSearch的一些主要概念。
下載下傳并運作ElasticSearch
ElasticSearch可以從elasticsearch.org下載下傳對應的檔案格式,如ZIP和TAR.GZ。下載下傳并提取一個運作它的軟體包之後不會容易得多,需要提前安裝Java運作時環境。
下載下傳連結 https://www.elastic.co/products/elasticsearch
在Windows上運作ElasticSearch
- 從指令視窗運作位于bin檔案夾中的elasticsearch.bat。這将會啟動ElasticSearch在控制台的前台運作,這意味着我們可在控制台中看到運作資訊或一些錯誤資訊,并可以使用CTRL + C停止或關閉它。
- 在啟動過程中,ElasticSearch的執行個體運作會占用大量的記憶體,是以在這一過程中,電腦會變得比較慢,需要耐心等待,啟動加載完成後電腦就可以正常使用了
- 當ElasticSearch的執行個體并運作,您可以使用http://localhost:9200檢查是否運作成功
安裝ik中文分詞器
下載下傳位址:https://github.com/medcl/elasticsearch-analysis-ik/releases
- 選擇和已經下載下傳的elasticsearch版本相容的ik。
- 解壓後複制
目錄下elasticsearch/plugins
- 重新運作
elasticsearch.bat
ik測試使用
可以使用谷歌的 Postman
工具測試
建立一個索引:
curl -XPUT http://localhost:9200/index
建立一個映射
curl -XPOST http://localhost:9200/index/fulltext/_mapping -H 'Content-Type:application/json' -d'
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_max_word"
}
}
}'
添加索引文檔測試資料
curl -XPOST http://localhost:9200/index/fulltext/1 -H 'Content-Type:application/json' -d'
{"content":"美國留給伊拉克的是個爛攤子嗎"}
curl -XPOST http://localhost:9200/index/fulltext/2 -H 'Content-Type:application/json' -d'
{"content":"公安部:各地校車将享最高路權"}
curl -XPOST http://localhost:9200/index/fulltext/3 -H 'Content-Type:application/json' -d'
{"content":"中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"}
curl -XPOST http://localhost:9200/index/fulltext/4 -H 'Content-Type:application/json' -d'
{"content":"中國駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首"}
查詢突出顯示
curl -XPOST http://localhost:9200/index/fulltext/_search -H 'Content-Type:application/json' -d'
{
"query" : { "match" : { "content" : "中國" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
傳回結果
{
"took": 14,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"failed": 0
},
"hits": {
"total": 2,
"max_score": 2,
"hits": [
{
"_index": "index",
"_type": "fulltext",
"_id": "4",
"_score": 2,
"_source": {
"content": "中國駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首"
},
"highlight": {
"content": [
"<tag1>中國</tag1>駐洛杉矶領事館遭亞裔男子槍擊 嫌犯已自首 "
]
}
},
{
"_index": "index",
"_type": "fulltext",
"_id": "3",
"_score": 2,
"_source": {
"content": "中韓漁警沖突調查:韓警平均每天扣1艘中國漁船"
},
"highlight": {
"content": [
"均每天扣1艘<tag1>中國</tag1>漁船 "
]
}
}
]
}
}
安裝ElasticSearch的Head插件
安裝head需要安裝node和grunt
- 安裝nodejs:https://nodejs.org/en/download
- 安裝grunt:
安裝完成後執行grunt -version檢視是否安裝成功,會顯示安裝的版本号npm install -g grunt-cli
修改elasticsearch.yml檔案
去掉network.host: 192.168.0.1的注釋并改為network.host: 0.0.0.0,
去掉cluster.name;node.name;http.port的注釋
在檔案的末尾加入以下代碼:
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
- 安裝head: 下載下傳位址 https://github.com/mobz/elasticsearch-head 。解壓後 執行
安裝完成後執行npm install
或者grunt server
運作npm run start
插件,如果不成功重新安裝head
。通路界面 http://localhost:9100/grunt
Linux安裝ElasticSearch
https://blog.csdn.net/weixin_41615494/article/details/79591335
通路elasticSearch官網位址 https://www.elastic.co/
下載下傳指定版本的安裝包:elasticsearch-6.1.1.tar.gz,上傳至指定目錄/usr/local/elasticsearch
#解壓
tar -zxvf elasticsearch-6.1.1.tar.gz
#建立資料存儲目錄
mkdir -p /usr/local/elasticsearch/data
#建立日志存儲目錄
mkdir -p /usr/local/elasticsearch/logs
#進入到es安裝目錄下的config檔案夾中,修改elasticsearch.yml 檔案
#配置es的叢集名稱,預設是elasticsearch,es會自動發現在同一網段下的es,如果在同一網段下有多個叢集,就可以用這個屬性來區分不同的叢集。
cluster.name: qxw-application
#節點名稱
node.name: node-1
#設定索引資料的存儲路徑
path.data: /usr/local/elasticsearch/data
#設定日志的存儲路徑
path.logs: /usr/local/elasticsearch/logs
#設定目前的ip位址,通過指定相同網段的其他節點會加入該叢集中
network.host: 192.168.1.191
#設定對外服務的http端口
http.port: 9200
#設定叢集中master節點的初始清單,可以通過這些節點來自動發現新加入叢集的節點
discovery.zen.ping.unicast.hosts: ["node-1"]
修改host 檔案,執行指令 vi /etc/hosts
因為安全問題elasticsearch 不讓用root使用者直接運作,是以要建立新使用者。
useradd es
passwd es
再輸入兩次密碼(自定義)
#給新建立使用者檔案夾執行權限
chown -R es:es /usr/local/elasticsearch
切換es使用者:su es
啟動叢集指令:
cd /usr/local/elasticsearch
bin/elasticsearch
在es使用者下啟動時報錯
原因:Centos6不支援SecComp,而ES預設bootstrap.system_call_filter為true進行檢測,是以導緻檢測失敗,失敗後直接導緻ES不能啟動
詳見 :https://github.com/elastic/elasticsearch/issues/22899
解決方案:
在elasticsearch.yml中新增配置bootstrap.system_call_filter,設為false。
bootstrap.system_call_filter: false
第一個問題的原因:
原因:無法建立本地檔案問題,使用者最大可建立檔案數太小
解決方案:切換到root使用者,編輯limits.conf配置檔案, 添加類似如下内容:
vi /etc/security/limits.conf
添加如下内容: 注意*不要去掉了
* soft nofile 65536
* hard nofile 131072
備注:* 代表Linux所有使用者名稱(比如 hadoop)
需要儲存、退出、重新登入才可生效。
第二個錯誤的原因:
原因:無法建立本地線程問題,使用者最大可建立線程數太小
解決方案:切換到root使用者,進入limits.d目錄下,修改90-nproc.conf 配置檔案。
vi /etc/security/limits.d/90-nproc.conf
找到如下内容:
* soft nproc 1024
#修改為
* soft nproc 4096
第三個錯誤的原因:
原因:最大虛拟記憶體太小
每次啟動機器都手動執行下。
root使用者執行指令:
執行指令:sysctl -w vm.max_map_count=262144
檢視修改結果指令:sysctl -a|grep vm.max_map_count 看是否已經修改
永久性修改政策:
echo "vm.max_map_count=262144" >> /etc/sysctl.conf
切換到es使用者執行:bin/elasticsearch
通路:http://192.168.1.191:9200/
#背景啟動
[[email protected] elasticsearch-6.4.0]$ ./bin/elasticsearch -d
[[email protected] elasticsearch-6.4.0]$ jps
27587 Jps
27573 Elasticsearch
java中使用elastaicsearch(RestHighLevelClient)
官方文檔可以得知,現在存在至少三種Java用戶端。
- Transport Client
-
Java High Level REST Client
- Java Low Level Rest Client
- 強烈建議ES5及其以後的版本使用Java High Level REST Client
java High Level REST Client 介紹
- Java High Level REST Client 是基于Java Low Level REST Client的,每個方法都可以是同步或者異步的。同步方法傳回響應對象,而異步方法名以“async”結尾,并需要傳入一個監聽參數,來確定提醒是否有錯誤發生。
- Java High Level REST Client需要Java1.8版本和ES。并且ES的版本要和用戶端版本一緻。和TransportClient接收的參數和傳回值是一樣的。
引入maven依賴
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.3</version>
</dependency>
Java基礎操作
public class RestClientTest {
public static void main(String[] args) {
// index();
// bacthIndex();
queryTest();
}
/**
* 插入資料
*/
public static void index(){
try {
//RestHighLevelClient執行個體需要低級用戶端建構器來建構
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
IndexRequest indexRequest = new IndexRequest("demo", "demo");
JSONObject obj=new JSONObject();
obj.put("title","标題圖表題大法師飛灑發順豐三");
obj.put("time","2018-08-21 17:43:50");
indexRequest.source(obj.toJSONString(),XContentType.JSON);
//添加索引
client.index(indexRequest);
client.close();
//http://localhost:9200/demo/demo/_search 浏覽器運作查詢資料
}catch (Exception e){
e.printStackTrace();
}
}
/**
* 批量插入資料
*/
public static void bacthIndex(){
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
List<IndexRequest> requests = new ArrayList<>();
requests.add(generateNewsRequest("中印邊防軍于拉達克舉行會晤 強調維護邊境和平", "2018-01-27T08:34:00Z"));
BulkRequest bulkRequest = new BulkRequest();
for (IndexRequest indexRequest : requests) {
bulkRequest.add(indexRequest);
}
try {
client.bulk(bulkRequest);
client.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static IndexRequest generateNewsRequest(String title,String publishTime){
IndexRequest indexRequest = new IndexRequest("demo", "demo");
JSONObject obj=new JSONObject();
obj.put("title",title);
obj.put("time",publishTime);
indexRequest.source(obj.toJSONString(),XContentType.JSON);
return indexRequest;
}
/**
* 查詢操作
* https://blog.csdn.net/paditang/article/details/78802799
* https://blog.csdn.net/A_Story_Donkey/article/details/79667670
* https://www.cnblogs.com/wenbronk/p/6432990.html
*/
public static void queryTest(){
RestHighLevelClient client = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http")));
// 這個sourcebuilder就類似于查詢語句中最外層的部分。包括查詢分頁的起始,
// 查詢語句的核心,查詢結果的排序,查詢結果截取部分傳回等一系列配置
SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
try {
// 結果開始處
sourceBuilder.from(0);
// 查詢結果終止處
sourceBuilder.size(2);
// 查詢的等待時間
sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
/**
* 使用QueryBuilder
* termQuery("key", obj) 完全比對
* termsQuery("key", obj1, obj2..) 一次比對多個值
* matchQuery("key", Obj) 單個比對, field不支援通配符, 字首具進階特性
* multiMatchQuery("text", "field1", "field2"..); 比對多個字段, field有通配符忒行
* matchAllQuery(); 比對所有檔案
*/
MatchQueryBuilder matchQueryBuilder = QueryBuilders.matchQuery("title", "費德勒");
//分詞精确查詢
// TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("tag", "體育");
// // 查詢在時間區間範圍内的結果 範圍查詢
// RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("publishTime");
// rangeQueryBuilder.gte("2018-01-26T08:00:00Z");
// rangeQueryBuilder.lte("2018-01-26T20:00:00Z");
// 等同于bool,将兩個查詢合并
BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
boolBuilder.must(matchQueryBuilder);
// boolBuilder.must(termQueryBuilder);
// boolBuilder.must(rangeQueryBuilder);
sourceBuilder.query(boolBuilder);
// 排序
// FieldSortBuilder fsb = SortBuilders.fieldSort("date");
// fsb.order(SortOrder.DESC);
// sourceBuilder.sort(fsb);
SearchRequest searchRequest = new SearchRequest("demo");
searchRequest.types("demo");
searchRequest.source(sourceBuilder);
SearchResponse response = client.search(searchRequest);
System.out.println(response);
client.close();
}catch (Exception e){
e.printStackTrace();
}
}
}