一旨指、安裝elasticsearch6.4
注意:在此安裝之前,不管是linux系統(tǒng)還是windows系統(tǒng)必須先安裝好jdk1.8及更高版本猫态。
JDK1.8安裝方式在我的簡(jiǎn)書(shū)中有可以自行查找一下檬嘀。
windows 10 環(huán)境下
1.先點(diǎn)擊下面的下載地址進(jìn)行下載
https://www.elastic.co/downloads/elasticsearch
(建議使用elastic時(shí),下載elastic 最新版本审洞,每個(gè)版本之前的差異比較大,5.x以后把之前低版本的api類及方法更改與刪除很多待讳,前后分別實(shí)現(xiàn)的過(guò)程差別大)在這里我使用的是elasticsearch6.4
這里是elasticsearch的所有歷史版本
解壓下載的壓縮文件芒澜,我們可以看到
2.修改解壓包中的配置文件
2.1打開(kāi)并編輯D:\elasticsearch-6.4.3\elasticsearch-6.4.3\config\elasticsearch.yml
# 集群的名字
cluster.name: zwj-cluster
# 節(jié)點(diǎn)名字
node.name: node-1
# 數(shù)據(jù)存儲(chǔ)目錄(多個(gè)路徑用逗號(hào)分隔)也就是 索引數(shù)據(jù)的存儲(chǔ)路徑
path.data: /home/zwj/es/data
# 日志目錄
path.logs: /home/zwj/es/logs
#本機(jī)的ip地址
network.host: 192.168.1.102
#設(shè)置集群中master節(jié)點(diǎn)的初始列表,可以通過(guò)這些節(jié)點(diǎn)來(lái)自動(dòng)發(fā)現(xiàn)新加入集群的節(jié)點(diǎn)
discovery.zen.ping.unicast.hosts: ["192.168.1.102"]
#discovery.zen.minimum_master_nodes: 2
# 設(shè)置節(jié)點(diǎn)間交互的tcp端口(集群),(默認(rèn)9300)
transport.tcp.port: 9300
# 設(shè)置對(duì)外服務(wù)的http端口创淡,默認(rèn)為9200
http.port: 9200
# 增加參數(shù)痴晦,使head插件可以訪問(wèn)es
http.cors.enabled: true
http.cors.allow-origin: "*"
#指定該節(jié)點(diǎn)是否有資格被選舉成為master節(jié)點(diǎn),默認(rèn)是true琳彩,es是默認(rèn)集群中的第一臺(tái)機(jī)器為master誊酌,如果這臺(tái)機(jī)掛了就會(huì)重新選舉master
node.master: true
#允許該節(jié)點(diǎn)存儲(chǔ)數(shù)據(jù)(默認(rèn)開(kāi)啟)
node.data: true
2.2 編輯D:\elasticsearch-6.4.3\elasticsearch-6.4.3\config\jvm.options
-Xms1g 改成-Xms512m
-Xmx1g 改成-Xmx512m
2.3運(yùn)行elasticsearch
進(jìn)入/bin目錄點(diǎn)擊elasticsearch.bat運(yùn)行elasticsearch.
3.安裝插件
3.1安裝head
在elasticsearch5.0之前安裝都是用plugin命令,
在elasticsearch5.0之后的高版本安裝head需要先安裝node和grunt
node下載地址
https://nodejs.org/en/download/
選擇對(duì)應(yīng)的系統(tǒng)及位版本msi下載露乏,完成后雙擊安裝碧浊。
安裝完成用cmd進(jìn)入安裝目錄執(zhí)行 node -v可查看版本號(hào)。
執(zhí)行 npm install -g grunt-cli 安裝grunt 瘟仿,安裝完成后執(zhí)行g(shù)runt -version查看是否安裝成功箱锐,會(huì)顯示安裝的版本號(hào)
現(xiàn)在安裝head
在https://github.com/mobz/elasticsearch-head中下載head插件,選擇下載zip,可以通過(guò)git clone 下來(lái)
zip解壓得到文件夾elasticsearch-head-master劳较,編輯Gruntfile.js加上hostname:'*'
在cmd 窗口中定位到自己elasticsear head master路徑
下執(zhí)行npm install 安裝完成后執(zhí)行g(shù)runt server 或者npm run start 運(yùn)行head插件驹止,如果不成功重新安裝grunt。
運(yùn)行g(shù)runt server
以上完成 了head插件的安裝了观蜗。
通過(guò)瀏覽器訪問(wèn)http://localhost:9100或http://本機(jī)ip地址:9100 如下圖
我們可以看到 http://localhost:9200 未連接臊恋,是因?yàn)樵诖酥?elasticsearch 的配置文件 elasticsearch.yml 中 network.host配置了準(zhǔn)確的ip地址。所以 要把 http://localhost:9200改為 http://192.168.1.102:9200
就可以了嫂便。
在這個(gè)頁(yè)面中可以進(jìn)行相應(yīng)的操作啦捞镰。
3.2安裝ik分詞器
ik分詞器的下載地址https://github.com/medcl/elasticsearch-analysis-ik
通過(guò)git clone 或者直接zip 下載下來(lái)后解壓
在我們的elasticserarch安裝目錄F:\letgo\elasticsearch-6.4.3\elasticsearch-6.4.3\plugins下新建 ik 文件夾
把elasticsearch-analysis-ik文件內(nèi)容copy放入 ik 文件夾下
重啟es闸与,可以看到多了loaded plugin analysis-ik,這就要以啦毙替!
4.遇到的錯(cuò)誤
可以查看D:\es2\logs下面的日志
4.1 elasticsearch 運(yùn)行控件窗口出現(xiàn)中國(guó)亂碼
解決辦法:編輯/config/jvm.option文件,把utf-8改成GBK即可践樱。
4.2 elasticsearch 啟動(dòng)錯(cuò)誤閃退1Caused by: java.net.BindException: Cannot assign requested address: bind
解決辦法:編輯/config/elasticsearch.yml network.host:本地ip地址厂画,
本地ip地址可通過(guò)cmd下ipconfig查看 ,一定要是正確的本地ip地址拷邢。
linux centos6.5 環(huán)境下 ElasticSearch搭建
1袱院、準(zhǔn)備1臺(tái)linux centos64位機(jī)器
2、安裝包解壓
準(zhǔn)備好elasticsearch6.4.3安裝包并解壓、然后執(zhí)行命令忽洛,
tar -zxvf elasticsearch6.4.3.tar.gz
3腻惠、修改配置文件
vim config/elasticsearch.yml
編輯vim config/jvm.options
4、 運(yùn)行elasticsearch
cd bin
./elasticsearch
./elasticsearch -d
運(yùn)行中沒(méi)有報(bào)錯(cuò)欲虚,但在瀏覽器上就是無(wú)法訪問(wèn)可能是防火墻導(dǎo)致的集灌。關(guān)閉一下或都添加對(duì)面開(kāi)放端口9200 ,9300 即可复哆。
報(bào)錯(cuò)1欣喧,用戶不能用root。
添加新用戶wenjinzhu并設(shè)置密碼
切換用戶梯找,再次運(yùn)行elasticsearch
報(bào)錯(cuò)2唆阿,權(quán)限不夠。
切換到root
su root
輸入密碼锈锤。
定位 cd /home下
chmod -R 777 zwj
su wenjinzhu
cd /home/ela/elasticsearch6.4.3/bin
./elasticsearch
./elasticsearch -d
dna
成功運(yùn)行驯鳖。在瀏覽器地址欄輸入 http://172.16.53.27:9200訪問(wèn)如下
ps -ef|grep ela 查看當(dāng)前進(jìn)程中是否運(yùn)行著elasticsearch
elasticsearch 后臺(tái)運(yùn)行命令
./elasticsearch -d
5式廷、elasticsearch 關(guān)閉
前臺(tái)運(yùn)行:可以通過(guò)”CTRL+C”組合鍵來(lái)停止運(yùn)行
后臺(tái)運(yùn)行肴茄,可以通過(guò)”kill -9 進(jìn)程號(hào)”停止.
6秉继、elasticsearch運(yùn)行時(shí)報(bào)的其它錯(cuò)誤
vim /etc/security/limits.conf
* soft nofile 262144
* hard nofile 262144
es soft memlock unlimited
es hard memlock unlimited
6.1 max file descriptor
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
解決方法恢总,請(qǐng)用root權(quán)限修改冬竟,修改完記得重啟elasticsearch和使用配置參數(shù)在環(huán)境里面生效(重新登錄用戶):(如果還有錯(cuò)誤請(qǐng)把數(shù)字再設(shè)置大一點(diǎn))
vi /etc/security/limits.conf
* soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
6.2 max number of threads
max number of threads [1024] for user [user] is too low, increase to at least [2048]
解決方法: (* 表示對(duì)所有用戶有效)
vi /etc/security/limits.d/90-nproc.conf
* soft nproc 1024
6.3 max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
臨時(shí)設(shè)置:sudo sysctl -w vm.max_map_count=262144
永久修改:
修改/etc/sysctl.conf 文件吊奢,添加 “vm.max_map_count”設(shè)置
并執(zhí)行:sysctl -p
6.4 出現(xiàn) java.net.BindException: 地址已在使用
解決辦法:首先查看 本機(jī)ip地址與networkhost的地址是否一樣糕韧,然后在看默認(rèn)端口9200寺滚,9300是否 被占用
kill -9 進(jìn)程號(hào)
6.5但凡出現(xiàn)java.nio.file.AccessDeniedException這樣的錯(cuò)誤
一定是新生成 的文件被拒絕訪問(wèn)了沒(méi)有root權(quán)限丁寄。
su root
chmod -R 777 該文件
7氨淌、安裝head插件
elasticsearch5.0之前安裝head方法
直接安裝
./bin/plugin install mobz/elasticsearch-head
zip包安裝
1. https://github.com/mobz/elasticsearch-head下載zip 解壓
2. 建立elasticsearch-2.4.0\plugins\head文件
3. 將解壓后的elasticsearch-head-master文件夾下的文件copy到head
4. 運(yùn)行es
驗(yàn)證 瀏覽器輸入 http://172.16.53.25:9200/_plugin/head
elasticsearch5.0之后高版本的安裝head方法
下載 elasticsearch-head 或者 git clone 到隨便一個(gè)文件夾
https://github.com/mobz/elasticsearch-head
安裝nodejs
下載Node.js
https://nodejs.org/en/download/
選擇 linux 64位
下載后得到node-v10.13.0-linux-x64.tar.xz
解壓
tar -zxvf node-v8.9.4-linux-x64.tar.xz
有問(wèn)題用下面的
tar -xvf node-v8.9.4-linux-x64.tar.xz
修改 /etc/profile變?yōu)槿挚捎?br>
vim /etc/profile
export NODEJS_HOME=/home/nodejs/node-v10.13.0-linux-x64
export PATH=$PATH:$NODEJS_HOME/bin
source /etc/profile 執(zhí)行
測(cè)試
node -v
在https://github.com/mobz/elasticsearch-head中下載head插件,選擇下載zip,可以通過(guò)git clone 下來(lái)
cd /home/es/elasticsearch-head-master
修改Gruntfile.js
配置添加 hostname:'*'
npm install -g grunt-cli
可能會(huì)遇到權(quán)限問(wèn)題報(bào)錯(cuò)
su root
npm install -g grunt-cli 再次執(zhí)行
npm install
grunt server
或 在后臺(tái)運(yùn)行 grunt server &
http://172.16.16.27:9100成功
8伊磺、安裝ik分詞器
下載地址盛正,尋找與當(dāng)前安裝es版本一致的ik
https://github.com/medcl/elasticsearch-analysis-ik/releases
解壓elasticsearch-analysis-ik-6.4.3.zip
把它里面的內(nèi)容copy到 elasticsearch6.4.3解壓目錄 的/plugin/ik下面。
重啟es即可屑埋。
二豪筝、基于Java開(kāi)發(fā)的API
elasticsearch maven 下面所依賴的jar.
<!-- ela start -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.7</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<!-- <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency> -->
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.3</version>
</dependency>
<!-- ela end -->
1、創(chuàng)建TransprostClient單例獲取instance 對(duì)象
package com.wenjin.elasticsearch;
import java.net.InetAddress;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
/**
*
*
* @Title: TransprostClientManager.java
* @Package com.wenjin.elasticsearch
* @Description:
* @author: wenjin.zhu
* @date: 2018年11月21日 下午1:30:42
* @version V1.0
*/
public class TransprostClientManager {
private static volatile TransportClient instance;
private TransprostClientManager() {
}
@SuppressWarnings("resource")
public static TransportClient getInstance(){
Settings settings = Settings.builder().put("cluster.name", "zwj-cluster").put("client.transport.sniff", true).build();
if (instance == null) {
synchronized (TransportClient.class) {
if (instance == null) {
try {
instance = new PreBuiltTransportClient(settings).addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("172.16.52.1"), 9300));
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
return instance;
}
}
2摘能、ES CRUD增刪改查
package com.wenjin.zhu.elasticsearch;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.transport.TransportClient;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
*
*
* @Title: EsJavaApi.java
* @Package com.wenjin.elasticsearch
* @Description: elastic api
* @author: wenjin.zhu
* @date: 2018年11月14日 下午2:18:24
* @version V1.0
*/
public class EsJavaApi {
private static TransportClient client = TransprostClientManager.getInstance();
public static String index = "yuqing";
public static String type = "targetData";
public static void main(String[] args) {
TargetData targetData = new TargetData();
targetData.setContentText("contentText");
targetData.setTitle("title");
// 創(chuàng)建索引文檔
save(targetData);
// 搜索文檔
get("00ca365ae9024553b216ce9a25a86246");
// 更新文檔
update(targetData);
// 刪除文檔
delete("00ca365ae9024553b216ce9a25a86246");
client.close();
}
@SuppressWarnings("deprecation")
public static void save(TargetData target) {
ObjectMapper mapper = new ObjectMapper();
try {
byte[] bytes = mapper.writeValueAsBytes(target);
IndexResponse response = client.prepareIndex(index, type, target.getId()).setSource(bytes).get();
System.out.println(response.getResult()); // CREATED
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
public static void get(String id) {
GetResponse response = client.prepareGet(index, type, id).setOperationThreaded(false) // 默認(rèn)為true,在不同的線程執(zhí)行
.get();
System.out.println(response.getSourceAsString());
}
public static String show(String id) {
GetResponse response = client.prepareGet(index, type, id).setOperationThreaded(false) // 默認(rèn)為true,在不同的線程執(zhí)行
.get();
return response.getSourceAsString();
}
@SuppressWarnings("deprecation")
public static void update(TargetData target) {
UpdateRequest updateRequest = new UpdateRequest();
updateRequest.index(index);
updateRequest.type(type);
updateRequest.id("2");
ObjectMapper mapper = new ObjectMapper();
try {
updateRequest.doc(mapper.writeValueAsBytes(target));
client.update(updateRequest).get();
} catch (Exception e) {
e.printStackTrace();
}
}
public static boolean delete(String id) {
try {
DeleteResponse response = client.prepareDelete(index, type, id).get();
System.out.println(response);
return true;
} catch (Exception e) {
return false;
}
}
public static void close() {
client.close();
}
}
3续崖、ES 排序 及分頁(yè)
package com.wenjin.zhu.elasticsearch;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.sort.SortBuilder;
import org.elasticsearch.search.sort.SortBuilders;
import org.elasticsearch.search.sort.SortOrder;
/**
*
*
* @Title: EsJavaApi.java
* @Package com.wenjin.elasticsearch
* @Description: elastic api
* @author: wenjin.zhu
* @date: 2018年11月14日 下午2:18:24
* @version V1.0
*/
public class EsJavaApi {
private static TransportClient client = TransprostClientManager.getInstance();
public static String index = "yuqing";
public static String type = "targetData";
public static void main(String[] args) {
Map<String, String> map2 = new HashMap<String, String>();
map2.put("title", "*泄露個(gè)人隱*");
map2.put("is_sen", "1");
map2.put("over_sea", "1");
// 查詢滿足條件后第一頁(yè)的數(shù)據(jù)
List<TargetData> targetlist = getDataByMuchillegible(type, map2, 1,"0","1");
// 查詢滿足條件后的數(shù)據(jù)總記錄數(shù)
int totalCount = getDataByMuchillegibleCount(type, map2, "0", "1");
// 總頁(yè)數(shù)
int pageCount = (totalCount + 10 - 1) / 10;
}
/**
*
* @Title: getDataByMuchillegible
* @Description: 多條件 模糊查詢
* @param: @param type
* @param: @param map
* @param: @param page
* @param: @return
* @return: List<Map<String,Object>>
* @throws
*/
public static List<TargetData> getDataByMuchillegible(String type, Map<String, String> map, int page,
String sortType, String timeType) {
int from = 0;
if (page == 0) {
from = 0;
} else if (page == 1) {
from = 0;
} else {
from = page * 10 - 10;
}
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (("2").equals(map.get("over_sea"))) {
// 全部 國(guó)內(nèi)+國(guó)外
map.remove("over_sea");
}
if (("2").equals(map.get("is_sen"))) {
// 全部 敏感+非敏感
map.remove("is_sen");
}
for (String in : map.keySet()) {
// map.keySet()返回的是所有key的值
String str = map.get(in);// 得到每個(gè)key多對(duì)用value的值
boolQueryBuilder.must(QueryBuilders.matchQuery(in, str));
}
SearchResponse response = null;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String currentTime = dateFormat.format(new java.util.Date()) + " 00:00";
long time = 0, endtime = 0;
try {
time = String2Date.stringToDate2(currentTime).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
SortBuilder<?> sortBuilder = SortBuilders.fieldSort("releaseDate").order(SortOrder.DESC);
if ("0".equals(sortType)) {
// 時(shí)間降序
sortBuilder = SortBuilders.fieldSort("releaseDate").order(SortOrder.DESC);
} else if ("1".equals(sortType)) {
// 時(shí)間升序
sortBuilder = SortBuilders.fieldSort("releaseDate").order(SortOrder.ASC);
} else {
// 入庫(kù)時(shí)間
sortBuilder = SortBuilders.fieldSort("createDate").order(SortOrder.DESC);
}
if ("0".equals(timeType)) {
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder).setFrom(from)
.addSort(sortBuilder).setSize(10).setExplain(true).execute().actionGet();
} else if ("1".equals(timeType)) {
// 今天
endtime = time + 86400000;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(from)
.addSort(sortBuilder).setSize(10).setExplain(true).execute().actionGet();
} else if ("2".equals(timeType)) {
// 2天
endtime = time + 86400000;
time = time - 86400000;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(from)
.addSort(sortBuilder).setSize(10).setExplain(true).execute().actionGet();
} else if ("3".equals(timeType)) {
// 3天
endtime = time + 86400000;
time = time - 86400000 * 2;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(from)
.addSort(sortBuilder).setSize(10).setExplain(true).execute().actionGet();
} else if ("7".equals(timeType)) {
// 7天
endtime = time + 86400000;
time = time - 86400000 * 6;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(from)
.addSort(sortBuilder).setSize(10).setExplain(true).execute().actionGet();
} else if ("10".equals(timeType)) {
// 10天
endtime = time + 86400000;
time = time - 86400000 * 9;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(from)
.addSort(sortBuilder).setSize(10).setExplain(true).execute().actionGet();
}
return responseToList(client, response);
}
/**
*
* @Title: getDataByMuchillegibleCount
* @Description: 多條件 模糊查詢 總數(shù)
* @param: @param type
* @param: @param map
* @param: @return
* @return: int
* @throws
*/
public static int getDataByMuchillegibleCount(String type, Map<String, String> map, String sortType,
String timeType) {
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if (("2").equals(map.get("over_sea"))) {
// 全部 國(guó)內(nèi)+國(guó)外
map.remove("over_sea");
}
if (("2").equals(map.get("is_sen"))) {
// 全部 敏感+非敏感
map.remove("is_sen");
}
for (String in : map.keySet()) {
// map.keySet()返回的是所有key的值
String str = map.get(in);// 得到每個(gè)key多對(duì)用value的值
boolQueryBuilder.must(QueryBuilders.matchQuery(in, str));
}
SearchResponse response = null;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String currentTime = dateFormat.format(new java.util.Date()) + " 00:00";
long time = 0, endtime = 0;
try {
time = String2Date.stringToDate2(currentTime).getTime();
endtime = time + 86400000;
} catch (ParseException e) {
e.printStackTrace();
}
if ("0".equals(timeType)) {
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder).setFrom(0).setSize(2000)
.setExplain(true).execute().actionGet();
} else if ("1".equals(timeType)) {
// 今天
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(0)
.setSize(2000).setExplain(true).execute().actionGet();
} else if ("2".equals(timeType)) {
// 2天
endtime = time + 86400000;
time = time - 86400000 * 1;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(0)
.setSize(2000).setExplain(true).execute().actionGet();
} else if ("3".equals(timeType)) {
// 3天
endtime = time + 86400000;
time = time - 86400000 * 2;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(0)
.setSize(2000).setExplain(true).execute().actionGet();
} else if ("7".equals(timeType)) {
// 7天
endtime = time + 86400000;
time = time - 86400000 * 6;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(0)
.setSize(2000).setExplain(true).execute().actionGet();
} else if ("10".equals(timeType)) {
// 10天
endtime = time + 86400000;
time = time - 86400000 * 9;
response = client.prepareSearch(index).setTypes(type).setQuery(boolQueryBuilder)
.setPostFilter(QueryBuilders.rangeQuery("releaseDate").from(time).to(endtime)).setFrom(0)
.setSize(2000).setExplain(true).execute().actionGet();
}
return responseToList(client, response).size();
}
/**
* 將查詢后獲得的response轉(zhuǎn)成list
*
* @param client
* @param response
* @return
*/
public static List<TargetData> responseToList(TransportClient client, SearchResponse response) {
/*took - Elasticsearch執(zhí)行此次搜索所用的時(shí)間(單位:毫秒)
timed_out - 告訴我們此次搜索是否超時(shí)
_shards - 告訴我們搜索了多少分片,還有搜索成功和搜索失敗的分片數(shù)量
hits - 搜索結(jié)果
hits.total - 符合搜索條件的文檔數(shù)量
hits.hits - 實(shí)際返回的搜索結(jié)果對(duì)象數(shù)組(默認(rèn)只返回前10條)
hits.sort - 返回結(jié)果的排序字段值(如果是按score進(jìn)行排序团搞,則沒(méi)有)
hits._score 和 max_score - 目前先忽略這兩個(gè)字段*/
//System.err.println("====="+response.toString());
SearchHits hits = response.getHits();
List<TargetData> list = new ArrayList<TargetData>();
for (int i = 0; i < hits.getHits().length; i++) {
Map<String, Object> map = hits.getAt(i).getSource();
// System.err.println("i:"+i+"----"+map.toString());
TargetData target = new TargetData();
try {
target.setTitle(map.get("title").toString());
} catch (NullPointerException e) {
System.err.println("title is null.");
}
try {
target.setContentText(map.get("contentText").toString());
} catch (NullPointerException e) {
System.err.println("contentText is null.");
}
try {
target.setKeyWord(map.get("keyWord").toString());
} catch (NullPointerException e) {
System.err.println("keyWord is null.");
}
try {
target.setFromTo(map.get("fromTo").toString());
} catch (NullPointerException e) {
System.err.println("fromTo is null.");
}
try {
target.setCreatTime(map.get("creatTime").toString());
} catch (NullPointerException e) {
System.err.println("creatTime is null.");
}
try {
target.setReleaseTime(map.get("releaseTime").toString());
} catch (NullPointerException e) {
System.err.println("releaseTime is null.");
}
try {
target.setId(map.get("id").toString());
} catch (NullPointerException e) {
System.err.println("id is null.");
}
try {
target.setCommentCount(map.get("commentCount").toString());
} catch (NullPointerException e) {
System.err.println("commentCount is null.");
}
try {
target.setType(map.get("type").toString());
} catch (NullPointerException e) {
System.err.println("type is null.");
}
try {
target.setTask_id(map.get("task_id").toString());
} catch (NullPointerException e) {
System.err.println("task_id is null.");
}
try {
target.setState(map.get("state").toString());
} catch (NullPointerException e) {
System.err.println("state is null.");
}
try {
target.setOver_sea(map.get("over_sea").toString());
} catch (NullPointerException e) {
System.err.println("over_sea is null.");
}
try {
target.setIs_sen(map.get("is_sen").toString());
} catch (NullPointerException e) {
System.err.println("is_sen is null.");
}
list.add(target);
}
return list;
}
}
4严望、聚合查詢must,not must,should <=> and,not,or
QueryBuilder queryBuilder = QueryBuilders.boolQuery().must(queryBuilder).mustNot(queryBuilder).should(queryBuilder);
QueryBuilder queryBuilder = QueryBuilders.boolQuery().should(boolQueryBuilder1).must(boolQueryBuilder2).mustNot(boolQueryBuilder3);
response = client.prepareSearch(index).setTypes(type).setQuery(queryBuilder).setFrom(from)
.addSort(sortBuilder).setSize(10).setExplain(true).execute().actionGet();
API demo 地址
https://download.csdn.net/download/u012898121/10802483
三、名詞簡(jiǎn)介
index: es里的index相當(dāng)于一個(gè)數(shù)據(jù)庫(kù)逻恐。
type: 相當(dāng)于數(shù)據(jù)庫(kù)里的一個(gè)表像吻。
id: 唯一峻黍,相當(dāng)于主鍵。
node:節(jié)點(diǎn)是es實(shí)例拨匆,一臺(tái)機(jī)器可以運(yùn)行多個(gè)實(shí)例姆涩,但是同一臺(tái)機(jī)器上的實(shí)例在配置文件中要確保http和tcp端口不同(下面有講)。
cluster:代表一個(gè)集群惭每,集群中有多個(gè)節(jié)點(diǎn)阵面,其中有一個(gè)會(huì)被選為主節(jié)點(diǎn),這個(gè)主節(jié)點(diǎn)是可以通過(guò)選舉產(chǎn)生的洪鸭,主從節(jié)點(diǎn)是對(duì)于集群內(nèi)部來(lái)說(shuō)的样刷。
shards:代表索引分片,es可以把一個(gè)完整的索引分成多個(gè)分片览爵,這樣的好處是可以把一個(gè)大的索引拆分成多個(gè)置鼻,分布到不同的節(jié)點(diǎn)上,構(gòu)成分布式搜索蜓竹。分片的數(shù)量只能在索引創(chuàng)建前指定箕母,并且索引創(chuàng)建后不能更改。
replicas:代表索引副本俱济,es可以設(shè)置多個(gè)索引的副本嘶是,副本的作用一是提高系統(tǒng)的容錯(cuò)性,當(dāng)個(gè)某個(gè)節(jié)點(diǎn)某個(gè)分片損壞或丟失時(shí)可以從副本中恢復(fù)蛛碌。二是提高es的查詢效率聂喇,es會(huì)自動(dòng)對(duì)搜索請(qǐng)求進(jìn)行負(fù)載均衡。