ElasticSearch6.4 從入門到進(jìn)階

一旨指、安裝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

elasticsearch6.4.3安裝包.png

這里是elasticsearch的所有歷史版本
elasticsearch歷史版本.png

解壓下載的壓縮文件芒澜,我們可以看到


解壓后的文件內(nèi)容

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

原來(lái)的配置

-Xms1g 改成-Xms512m
-Xmx1g 改成-Xmx512m


修改后的

2.3運(yùn)行elasticsearch

進(jìn)入/bin目錄點(diǎn)擊elasticsearch.bat運(yùn)行elasticsearch.


運(yùn)行成功

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ù)載均衡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蔚携,一起剝皮案震驚了整個(gè)濱河市希太,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酝蜒,老刑警劉巖誊辉,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異亡脑,居然都是意外死亡堕澄,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門霉咨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蛙紫,“玉大人,你說(shuō)我怎么就攤上這事躯护【矗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵棺滞,是天一觀的道長(zhǎng)裁蚁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)继准,這世上最難降的妖魔是什么枉证? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮移必,結(jié)果婚禮上室谚,老公的妹妹穿的比我還像新娘。我一直安慰自己崔泵,他們只是感情好秒赤,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著憎瘸,像睡著了一般入篮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幌甘,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天潮售,我揣著相機(jī)與錄音,去河邊找鬼锅风。 笑死酥诽,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的皱埠。 我是一名探鬼主播肮帐,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼边器!你這毒婦竟也來(lái)了泪姨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤饰抒,失蹤者是張志新(化名)和其女友劉穎肮砾,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體袋坑,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仗处,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了枣宫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婆誓。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖也颤,靈堂內(nèi)的尸體忽然破棺而出洋幻,到底是詐尸還是另有隱情,我是刑警寧澤翅娶,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布文留,位于F島的核電站好唯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏燥翅。R本人自食惡果不足惜骑篙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望森书。 院中可真熱鬧靶端,春花似錦、人聲如沸凛膏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)猖毫。三九已至台谍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鄙麦,已是汗流浹背典唇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胯府,地道東北人介衔。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骂因,于是被迫代替她去往敵國(guó)和親炎咖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容