ElasticSearch6.4 从入门到进阶

一、安装elasticsearch6.4

注意:在此安装之前,不管是linux系统还是windows系统必须先安装好jdk1.8及更高版本。
JDK1.8安装方式在我的简书中有可以自行查找一下。

windows 10 环境下

1.先点击下面的下载地址进行下载

https://www.elastic.co/downloads/elasticsearch
(建议使用elastic时,下载elastic 最新版本,每个版本之前的差异比较大,5.x以后把之前低版本的api类及方法更改与删除很多,前后分别实现的过程差别大)在这里我使用的是elasticsearch6.4

elasticsearch6.4.3安装包.png

这里是elasticsearch的所有历史版本
elasticsearch历史版本.png

解压下载的压缩文件,我们可以看到


解压后的文件内容

2.修改解压包中的配置文件

2.1打开并编辑D:\elasticsearch-6.4.3\elasticsearch-6.4.3\config\elasticsearch.yml

# 集群的名字  
cluster.name: zwj-cluster
# 节点名字  
node.name: node-1   
# 数据存储目录(多个路径用逗号分隔)也就是 索引数据的存储路径
path.data: /home/zwj/es/data  
# 日志目录  
path.logs: /home/zwj/es/logs  
#本机的ip地址
network.host: 192.168.1.102 
#设置集群中master节点的初始列表,可以通过这些节点来自动发现新加入集群的节点
discovery.zen.ping.unicast.hosts: ["192.168.1.102"]
#discovery.zen.minimum_master_nodes: 2  
# 设置节点间交互的tcp端口(集群),(默认9300)  
transport.tcp.port: 9300  
# 设置对外服务的http端口,默认为9200 
http.port: 9200  
# 增加参数,使head插件可以访问es  
http.cors.enabled: true  
http.cors.allow-origin: "*"
#指定该节点是否有资格被选举成为master节点,默认是true,es是默认集群中的第一台机器为master,如果这台机挂了就会重新选举master
node.master: true 
#允许该节点存储数据(默认开启)  
node.data: true

2.2 编辑D:\elasticsearch-6.4.3\elasticsearch-6.4.3\config\jvm.options

原来的配置

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


修改后的

2.3运行elasticsearch

进入/bin目录点击elasticsearch.bat运行elasticsearch.


运行成功

3.安装插件

3.1安装head

在elasticsearch5.0之前安装都是用plugin命令,

在elasticsearch5.0之后的高版本安装head需要先安装node和grunt
node下载地址
https://nodejs.org/en/download/
选择对应的系统及位版本msi下载,完成后双击安装。
安装完成用cmd进入安装目录执行 node -v可查看版本号。


执行 npm install -g grunt-cli 安装grunt ,安装完成后执行grunt -version查看是否安装成功,会显示安装的版本号

现在安装head
https://github.com/mobz/elasticsearch-head中下载head插件,选择下载zip,可以通过git clone 下来
zip解压得到文件夹elasticsearch-head-master,编辑Gruntfile.js加上hostname:'*'

在cmd 窗口中定位到自己elasticsear head master路径

下执行npm install 安装完成后执行grunt server 或者npm run start 运行head插件,如果不成功重新安装grunt。

运行grunt server

以上完成 了head插件的安装了。
通过浏览器访问http://localhost:9100或http://本机ip地址:9100 如下图

我们可以看到 http://localhost:9200 未连接,是因为在此之前 elasticsearch 的配置文件 elasticsearch.yml 中 network.host配置了准确的ip地址。所以 要把 http://localhost:9200改为 http://192.168.1.102:9200
就可以了。

在这个页面中可以进行相应的操作啦。

3.2安装ik分词器

ik分词器的下载地址https://github.com/medcl/elasticsearch-analysis-ik
通过git clone 或者直接zip 下载下来后解压
在我们的elasticserarch安装目录F:\letgo\elasticsearch-6.4.3\elasticsearch-6.4.3\plugins下新建 ik 文件夹
把elasticsearch-analysis-ik文件内容copy放入 ik 文件夹下


重启es,可以看到多了loaded plugin analysis-ik,这就要以啦!

4.遇到的错误

可以查看D:\es2\logs下面的日志

4.1 elasticsearch 运行控件窗口出现中国乱码

解决办法:编辑/config/jvm.option文件,把utf-8改成GBK即可。

4.2 elasticsearch 启动错误闪退1Caused by: java.net.BindException: Cannot assign requested address: bind

解决办法:编辑/config/elasticsearch.yml network.host:本地ip地址,
本地ip地址可通过cmd下ipconfig查看 ,一定要是正确的本地ip地址。

linux centos6.5 环境下 ElasticSearch搭建

1、准备1台linux centos64位机器

2、安装包解压

准备好elasticsearch6.4.3安装包并解压、然后执行命令,
tar -zxvf elasticsearch6.4.3.tar.gz

3、修改配置文件

vim config/elasticsearch.yml



编辑vim config/jvm.options


4、 运行elasticsearch

cd bin
./elasticsearch
./elasticsearch -d



运行中没有报错,但在浏览器上就是无法访问可能是防火墙导致的。关闭一下或都添加对面开放端口9200 ,9300 即可。

报错1,用户不能用root。

添加新用户wenjinzhu并设置密码


切换用户,再次运行elasticsearch


报错2,权限不够。
切换到root
su root
输入密码。
定位 cd /home下
chmod -R 777 zwj
su wenjinzhu
cd /home/ela/elasticsearch6.4.3/bin
./elasticsearch
./elasticsearch -d

dna
成功运行。在浏览器地址栏输入 http://172.16.53.27:9200访问如下

ps -ef|grep ela 查看当前进程中是否运行着elasticsearch

elasticsearch 后台运行命令
./elasticsearch -d

5、elasticsearch 关闭


前台运行:可以通过”CTRL+C”组合键来停止运行
后台运行,可以通过”kill -9 进程号”停止.

6、elasticsearch运行时报的其它错误

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]
解决方法,请用root权限修改,修改完记得重启elasticsearch和使用配置参数在环境里面生效(重新登录用户):(如果还有错误请把数字再设置大一点)
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]
解决方法: (* 表示对所有用户有效)
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]
临时设置:sudo sysctl -w vm.max_map_count=262144 
永久修改: 
修改/etc/sysctl.conf 文件,添加 “vm.max_map_count”设置 
并执行:sysctl -p
6.4 出现 java.net.BindException: 地址已在使用

解决办法:首先查看 本机ip地址与networkhost的地址是否一样,然后在看默认端口9200,9300是否 被占用
kill -9 进程号

6.5但凡出现java.nio.file.AccessDeniedException这样的错误

一定是新生成 的文件被拒绝访问了没有root权限。
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. 运行es
验证  浏览器输入 http://172.16.53.25:9200/_plugin/head

elasticsearch5.0之后高版本的安装head方法

下载 elasticsearch-head 或者 git clone 到随便一个文件夹
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
有问题用下面的
tar -xvf node-v8.9.4-linux-x64.tar.xz
修改 /etc/profile变为全局可用
vim /etc/profile

export NODEJS_HOME=/home/nodejs/node-v10.13.0-linux-x64
export PATH=$PATH:$NODEJS_HOME/bin

source /etc/profile 执行
测试
node -v


https://github.com/mobz/elasticsearch-head中下载head插件,选择下载zip,可以通过git clone 下来

cd /home/es/elasticsearch-head-master
修改Gruntfile.js
配置添加 hostname:'*'


npm install -g grunt-cli
可能会遇到权限问题报错


su root
npm install -g grunt-cli 再次执行
npm install
grunt server
或 在后台运行 grunt server &
http://172.16.16.27:9100成功

8、安装ik分词器

下载地址,寻找与当前安装es版本一致的ik
https://github.com/medcl/elasticsearch-analysis-ik/releases
解压elasticsearch-analysis-ik-6.4.3.zip
把它里面的内容copy到 elasticsearch6.4.3解压目录 的/plugin/ik下面。
重启es即可。

二、基于Java开发的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、创建TransprostClient单例获取instance 对象

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");
        // 创建索引文档
        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) // 默认为true,在不同的线程执行
                .get();
        System.out.println(response.getSourceAsString());
    }

    public static String show(String id) {
        GetResponse response = client.prepareGet(index, type, id).setOperationThreaded(false) // 默认为true,在不同的线程执行
                .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 排序 及分页

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", "*泄露个人隐*");
        map2.put("is_sen", "1");
        map2.put("over_sea", "1");
        // 查询满足条件后第一页的数据
        List<TargetData> targetlist = getDataByMuchillegible(type, map2, 1,"0","1");
        // 查询满足条件后的数据总记录数
        int totalCount = getDataByMuchillegibleCount(type, map2, "0", "1");
        // 总页数
        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"))) {
            // 全部 国内+国外
            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);// 得到每个key多对用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)) {
            // 时间降序
            sortBuilder = SortBuilders.fieldSort("releaseDate").order(SortOrder.DESC);
        } else if ("1".equals(sortType)) {
            // 时间升序
            sortBuilder = SortBuilders.fieldSort("releaseDate").order(SortOrder.ASC);
        } else {
            // 入库时间
            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:  多条件 模糊查询 总数  
     * @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"))) {
            // 全部 国内+国外
            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);// 得到每个key多对用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转成list
     * 
     * @param client
     * @param response
     * @return
     */
    public static List<TargetData> responseToList(TransportClient client, SearchResponse response) {
        /*took - Elasticsearch执行此次搜索所用的时间(单位:毫秒)
        timed_out - 告诉我们此次搜索是否超时
        _shards - 告诉我们搜索了多少分片,还有搜索成功和搜索失败的分片数量
        hits - 搜索结果
        hits.total - 符合搜索条件的文档数量
        hits.hits - 实际返回的搜索结果对象数组(默认只返回前10条)
        hits.sort - 返回结果的排序字段值(如果是按score进行排序,则没有)
        hits._score 和 max_score - 目前先忽略这两个字段*/
        //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

三、名词简介

index: es里的index相当于一个数据库。 
type: 相当于数据库里的一个表。 
id: 唯一,相当于主键。 
node:节点是es实例,一台机器可以运行多个实例,但是同一台机器上的实例在配置文件中要确保http和tcp端口不同(下面有讲)。 
cluster:代表一个集群,集群中有多个节点,其中有一个会被选为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。 
shards:代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上,构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。 
replicas:代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当个某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容