20187 月19
项目首页:https://github.com/Wizzercn/MqttWk
MqttWk
基于 nutzboot + t-io + redis + kafka 实现的MQTT服务broker
本项目代码主要来源于 netty/t-io/iot-mqtt-server 等众多项目,开源免费,欢迎交流学习
参考项目
使用说明
软件架构说明
- 使用t-io实现通信及协议解析
- 使用nutzboot提供依赖注入及属性配置
- 使用redis实现消息缓存,集群
- 使用kafka实现消息代理
项目结构
MqttWk
├── mqtt-codec -- MQTT协议解析的t-io实现
├── mqtt-auth -- MQTT服务连接时用户名和密码认证
├── mqtt-broker -- MQTT服务器功能的核心实现
├── mqtt-common -- 公共类及其他模块使用的服务接口及对象
├── mqtt-store -- MQTT服务器会话信息(redis缓存及kafka加载)
├── mqtt-zoo -- 教程文档或文件
├── mqtt-test-kafka -- kafka消费者接收消息
├── mqtt-test-websocket -- websocket通信测试示例
功能说明
- 参考MQTT3.1.1规范实现
- 完整的QoS服务质量等级实现
- 遗嘱消息, 保留消息及消息分发重试
- 心跳机制
- MQTT连接认证(可选择是否开启)
- SSL方式连接(可选择是否开启)
- 主题过滤(支持单主题订阅如 /mqtt/test –不可以/结尾, 通配符订阅 /mqtt/# –以/#结尾)
- Websocket支持(可选择是否开启)
- 集群功能
快速开始
- 下载已打包好的可运行的jar文件
- 运行jar文件(如果需要修改配置项,可以在application.properties修改)
- 打开mqtt-spy客户端, 填写相应配置下载
- 连接端口:8885, websocket 端口: 9995 websocket path: /mqtt
- 连接使用的用户名: demo
- 连接使用的密码: 8F3B8DE2FDC8BD3D792BE77EAC412010971765E5BDD6C499ADCEE840CE441BDEF17E30684BD95CA708F55022222CC6161D0D23C2DFCB12F8AC998F59E7213393
- 连接使用的证书在
mqtt-zoo\keystore\server.cer
集群使用
- 多机环境集群:
mqttwk.broker.kafka.bootstrap.servers=192.168.1.101:9092,192.168.1.102:9093
redis.mode=cluster
redis.nodes=192.168.1.103:16379,192.168.1.104:26379
- 单机环境集群:
mqttwk.broker.kafka.bootstrap.servers=127.0.0.1:9092,127.0.0.1:9093
redis.mode=normal
redis.host=127.0.0.1
自定义 – 连接认证
- 默认只是简单使用对用户名进行RSA密钥对加密生成密码, 连接认证时对密码进行解密和相应用户名进行匹配认证
- 使用中如果需要实现连接数据库或其他方式进行连接认证, 只需要重写
mqtt-auth模块下的相应方法即可
自定义 – 服务端证书
- 服务端证书存储在
mqtt-broker的resources/keystore/server.jks
- 用户可以制作自己的证书, 但存储位置和文件名必须使用上述描述的位置及文件名
生成环境部署
- 生成环境部署建议使用
keepalived+nginx+mqtt-broker方式
- 使用nginx的tcp和websocket反向代理mqtt-broker集群实现负载均衡
- 使用keepalived实现nginx的高可用
20186 月9
NutzWk 5.x 已发布一段时间,这段时间基于此版本开发了智慧水务系统(NB-IOT)、某物联网平台、某设备租赁平台、某智慧睡眠平台、某智慧园区项目等,开发和部署过程中遇到一些小问题,开这个帖子把一些经验分享出来省的大家走弯路。
项目地址1: https://github.com/Wizzercn/NutzWk
项目地址2: https://gitee.com/wizzer/NutzWk
1、运行环境
其实项目readme和wk-wiki 已经写的很清楚了,在此强调一下,不是说非这些版本不可,但对于新手来说最好版本号保持一致,能跑起来了您再折腾玩~~
<span class="pln">JDK </span>
<span class="lit">8</span> <span class="lit">162</span> <span class="pun">+</span>
<span class="typ">Maven</span> <span class="lit">3.5</span>
<span class="pun">.</span>
<span class="lit">3</span> <span class="pun">+</span>
<span class="typ">Redis</span> <span class="lit">4.0</span>
<span class="pun">.</span>
<span class="lit">8</span> <span class="pun">+</span>
<span class="typ">MySql</span> <span class="lit">5.7</span> <span class="pun">+</span>
<span class="typ">Zookeeper</span> <span class="lit">3.4</span>
<span class="pun">.</span>
<span class="lit">11</span> <span class="pun">+</span>
2、开发环境
一般建议使用IDEA进行开发,因为是maven多模块的项目,直接用IDEA打开项目根目录,它会通过maven下载jar包,自动构建项目
然后如何启动项目呢,有很多种方式,简单说几个:
1)打开每个NB项目(nutzboot简称)项目里的main类,右击运行,例如 cn.wizzer.sys.commons.core.***MainLauncher
2)通过IDEA 的Run 配置 Application 运行,详见 https://github.com/Wizzercn/NutzWk/blob/nutzboot-dubbo/wk-wiki/01.QuickStart/01.02.Start.md
3)命令行在NB项目根目录运行mvn compile nutzboot:run 或者IDEA右侧Maven管理界面里通过插件运行,,详见 https://github.com/nutzam/nutzboot-maven-plugin
3、启动顺序
保证MySQL、Redis、Zookeeper 都正常启动且为默认端口及默认配置(当然这些配置项可以在application.properties 修改的)
1)MySQL创建一个空白数据库,编码格式为UTF-8,数据库名称 nutzwk_nb
2)NB项目的模块启动顺序是 sys –> cms[可选] –> wx[可选] –> task[可选] –> web-platform –> web-api[可选]
3)如上所述,如果想运行访问后台,只需要启动 sys 和 web-platform即可,注意是有启动顺序的,其他模块需要用就启
4)task 定时任务是依赖于sys的,而web-platform系统管理对定时任务管理是依赖于 task模块的,如果你想让task独立运行并且不需要通过页面进行管理,自己少做改动即可,不是不可以哦
4、部署注意事项
1)因为登录页面对密码进行了RSA加密,有时候部署会遇到怎么也登录不了,而后台抛异常 java.lang.SecurityException: JCE cannot authenticate the provider BC 的情况,解决方法在代码注释里已写明了,不过很少有人去看
https://github.com/Wizzercn/NutzWk/blob/nutzboot-dubbo/wk-app/wk-nb-web-platform/src/main/java/cn/wizzer/app/web/commons/shiro/filter/PlatformAuthenticationFilter.java
<span class="lit">1</span>
<span class="pun">、编辑文件</span> <span class="pun">/</span>
<span class="pln">usr</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">/</span>
<span class="pln">jdk1</span>
<span class="pun">.</span>
<span class="lit">8.0</span>
<span class="pln">_162</span>
<span class="pun">/</span>
<span class="pln">jre</span>
<span class="pun">/</span>
<span class="pln">lib</span>
<span class="pun">/</span>
<span class="pln">security</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">.</span>
<span class="pln">security
</span>
<span class="pun">在</span>
<span class="lit">9</span>
<span class="pun">下面添加</span>
<span class="pln"> security</span>
<span class="pun">.</span>
<span class="pln">provider</span>
<span class="pun">.</span>
<span class="lit">10</span>
<span class="pun">=</span>
<span class="pln">org</span>
<span class="pun">.</span>
<span class="pln">bouncycastle</span>
<span class="pun">.</span>
<span class="pln">jce</span>
<span class="pun">.</span>
<span class="pln">provider</span>
<span class="pun">.</span>
<span class="typ">BouncyCastleProvider</span>
<span class="lit">2</span>
<span class="pun">、拷贝</span>
<span class="pln"> bcprov</span>
<span class="pun">-</span>
<span class="pln">jdk16</span>
<span class="pun">-</span>
<span class="lit">143.jar</span> <span class="pun">和</span>
<span class="pln"> bcprov</span>
<span class="pun">-</span>
<span class="pln">jdk15</span>
<span class="pun">-</span>
<span class="lit">135.jar</span> <span class="pun">到</span> <span class="pun">/</span>
<span class="pln">usr</span>
<span class="pun">/</span>
<span class="pln">java</span>
<span class="pun">/</span>
<span class="pln">jdk1</span>
<span class="pun">.</span>
<span class="lit">8.0</span>
<span class="pln">_162</span>
<span class="pun">/</span>
<span class="pln">jre</span>
<span class="pun">/</span>
<span class="pln">lib</span>
<span class="pun">/</span>
<span class="pln">ext </span>
<span class="pun">目录下</span>
<span class="lit">3</span>
<span class="pun">、别问我上面两个文件怎么找……</span>
(如果您是https的话可以把RSA加密方式改掉弃用哦)
2)服务器注意事项:服务器时间同步做没做、hosts里配没配主机名hostname和127.0.0.1的映射关系、内存够不够用(有没有给jar指定内存大小)等
5、其他
1)请关注 NutzWk 的动态,有新的版本发布建议及时更新,往往会修复问题或新增功能
2)如果 NutzWk 给了您帮助,或已用于生产, https://wizzer.cn/donation 欢迎打赏一定金额以资鼓励,创造国内良好的开源环境
3)最后感谢兽兽及nutz社区广大网友的帮助和鼓励,没有您们的支持,这个项目不会历经6年多还在更新前进
20184 月24
//设置代理
System.setProperty("http.proxySet", "true");
System.setProperty("http.proxyHost", "127.0.0.1");
System.setProperty("http.proxyPort", "1080");
20182 月26

1、MainServer 启动类
/**
* Created by Wizzer on 2018/2/26.
*/
@IocBean
public class MainServer {
private static final Log log = Logs.get();
public static void main(String[] args) {
try {
ComboIocLoader loader = new ComboIocLoader(
new String[]{"*json", "config/ioc/", "*anno", "cn.wizzer","*rabbitmq"}
);
NutIoc ioc = new NutIoc(loader);
//socket
ioc.get(SocketServer.class).init();
//http
ioc.get(HttpServer.class).init();
//mq
String topicQueue = "sweeper-tioTopicQueue";
ConnectionFactory factory = ioc.get(ConnectionFactory.class, "rabbitmq_cf");
Connection rabbitmq_conn = factory.newConnection();
Channel rabbitmq_channel = rabbitmq_conn.createChannel();
rabbitmq_channel.queueDeclare(topicQueue, true, false, false, null);
rabbitmq_channel.exchangeDeclare("sweeper-tioTopicExchange", BuiltinExchangeType.TOPIC, true);
rabbitmq_channel.queueBind(topicQueue, "sweeper-tioTopicExchange", "tio.#");
} catch (Exception e) {
e.printStackTrace();
}
}
}
2、SocketServer 数据接收
/**
* Created by Wizzer on 2018/2/26.
*/
@IocBean
public class SocketServer {
private static final Log log = Logs.get();
//handler, 包括编码、解码、消息处理
@Inject
private MyServerAioHandler myServerAioHandler;
//事件监听器,可以为null,但建议自己实现该接口,可以参考showcase了解些接口
private ServerAioListener aioListener;
//一组连接共用的上下文对象
private ServerGroupContext serverGroupContext;
//aioServer对象
private AioServer aioServer;
//有时候需要绑定ip,不需要则null
private String serverIp;
@Inject
private PropertiesProxy conf;
public void init() throws Exception {
int port = conf.getInt("server.socket.port", 8600);
log.debug("socket port::" + port);
serverGroupContext = new ServerGroupContext("tio", myServerAioHandler, aioListener);
serverGroupContext.setHeartbeatTimeout(30000);
aioServer = new AioServer(serverGroupContext);
aioServer.start(serverIp, port);
}
}
3、socket 数据包的解析
4、RabbitMQ 队列+消费者 实现数据入库
5、HttpServer 提供HTTP API用于对设备发送命令
6、socket 命令包的下发
源码:https://gitee.com/wizzer/demo
20181 月21
后台代码,自定义tag:
<span class="kwd">package</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">modules</span>
<span class="pun">.</span>
<span class="pln">tags</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">ex</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="typ">EsService</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">web</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">utils</span>
<span class="pun">.</span>
<span class="typ">YcDateUtil</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">app</span>
<span class="pun">.</span>
<span class="pln">ycold</span>
<span class="pun">.</span>
<span class="pln">modules</span>
<span class="pun">.</span>
<span class="pln">services</span>
<span class="pun">.</span>
<span class="typ">YcoldInquiryService</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> cn</span>
<span class="pun">.</span>
<span class="pln">wizzer</span>
<span class="pun">.</span>
<span class="pln">framework</span>
<span class="pun">.</span>
<span class="pln">page</span>
<span class="pun">.</span>
<span class="typ">Pagination</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="typ">BooleanUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="typ">StringUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">apache</span>
<span class="pun">.</span>
<span class="pln">commons</span>
<span class="pun">.</span>
<span class="pln">lang3</span>
<span class="pun">.</span>
<span class="pln">math</span>
<span class="pun">.</span>
<span class="typ">NumberUtils</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">beetl</span>
<span class="pun">.</span>
<span class="pln">core</span>
<span class="pun">.</span>
<span class="typ">GeneralVarTagBinding</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchRequestBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchResponse</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">action</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchType</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">common</span>
<span class="pun">.</span>
<span class="pln">text</span>
<span class="pun">.</span>
<span class="typ">Text</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">index</span>
<span class="pun">.</span>
<span class="pln">query</span>
<span class="pun">.</span>
<span class="typ">BoolQueryBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">index</span>
<span class="pun">.</span>
<span class="pln">query</span>
<span class="pun">.</span>
<span class="typ">QueryBuilders</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="typ">SearchHits</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">fetch</span>
<span class="pun">.</span>
<span class="pln">subphase</span>
<span class="pun">.</span>
<span class="pln">highlight</span>
<span class="pun">.</span>
<span class="typ">HighlightBuilder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">fetch</span>
<span class="pun">.</span>
<span class="pln">subphase</span>
<span class="pun">.</span>
<span class="pln">highlight</span>
<span class="pun">.</span>
<span class="typ">HighlightField</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">elasticsearch</span>
<span class="pun">.</span>
<span class="pln">search</span>
<span class="pun">.</span>
<span class="pln">sort</span>
<span class="pun">.</span>
<span class="typ">SortOrder</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">impl</span>
<span class="pun">.</span>
<span class="typ">PropertiesProxy</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">loader</span>
<span class="pun">.</span>
<span class="pln">annotation</span>
<span class="pun">.</span>
<span class="typ">Inject</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">ioc</span>
<span class="pun">.</span>
<span class="pln">loader</span>
<span class="pun">.</span>
<span class="pln">annotation</span>
<span class="pun">.</span>
<span class="typ">IocBean</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">lang</span>
<span class="pun">.</span>
<span class="typ">Strings</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">lang</span>
<span class="pun">.</span>
<span class="typ">Times</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">log</span>
<span class="pun">.</span>
<span class="typ">Log</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> org</span>
<span class="pun">.</span>
<span class="pln">nutz</span>
<span class="pun">.</span>
<span class="pln">log</span>
<span class="pun">.</span>
<span class="typ">Logs</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">ArrayList</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">Date</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">List</span>
<span class="pun">;</span>
<span class="kwd">import</span>
<span class="pln"> java</span>
<span class="pun">.</span>
<span class="pln">util</span>
<span class="pun">.</span>
<span class="typ">Map</span>
<span class="pun">;</span>
<span class="com">/**
* Created by wizzer on 2018/1/20.
*/</span>
<span class="lit">@IocBean</span>
<span class="kwd">public</span> <span class="kwd">class</span> <span class="typ">YcoldInquiryListTag</span> <span class="kwd">extends</span> <span class="typ">GeneralVarTagBinding</span> <span class="pun">{</span>
<span class="kwd">private</span> <span class="kwd">final</span> <span class="kwd">static</span> <span class="typ">Log</span>
<span class="pln"> log </span>
<span class="pun">=</span> <span class="typ">Logs</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">();</span>
<span class="lit">@Inject</span>
<span class="kwd">private</span> <span class="typ">EsService</span>
<span class="pln"> esService</span>
<span class="pun">;</span>
<span class="lit">@Inject</span>
<span class="kwd">private</span> <span class="typ">YcoldInquiryService</span>
<span class="pln"> ycoldInquiryService</span>
<span class="pun">;</span>
<span class="lit">@Inject</span>
<span class="kwd">private</span> <span class="typ">PropertiesProxy</span>
<span class="pln"> cfg</span>
<span class="pun">;</span>
<span class="lit">@Override</span>
<span class="kwd">public</span> <span class="kwd">void</span>
<span class="pln"> render</span>
<span class="pun">()</span> <span class="pun">{</span>
<span class="typ">String</span>
<span class="pln"> startDate </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"startDate"</span>
<span class="pun">));</span>
<span class="typ">String</span>
<span class="pln"> endDate </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"endDate"</span>
<span class="pun">));</span>
<span class="typ">String</span>
<span class="pln"> keyword </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"keyword"</span>
<span class="pun">));</span>
<span class="kwd">int</span>
<span class="pln"> pageNumber </span>
<span class="pun">=</span> <span class="typ">NumberUtils</span>
<span class="pun">.</span>
<span class="pln">toInt</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"pageNumber"</span>
<span class="pun">)),</span> <span class="lit">1</span>
<span class="pun">);</span>
<span class="kwd">int</span>
<span class="pln"> pageSize </span>
<span class="pun">=</span> <span class="typ">NumberUtils</span>
<span class="pun">.</span>
<span class="pln">toInt</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"pageSize"</span>
<span class="pun">)),</span> <span class="lit">10</span>
<span class="pun">);</span>
<span class="kwd">boolean</span>
<span class="pln"> highlight </span>
<span class="pun">=</span> <span class="typ">BooleanUtils</span>
<span class="pun">.</span>
<span class="pln">toBoolean</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"highlight"</span>
<span class="pun">)));</span>
<span class="kwd">boolean</span>
<span class="pln"> explain </span>
<span class="pun">=</span> <span class="typ">BooleanUtils</span>
<span class="pun">.</span>
<span class="pln">toBoolean</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"explain"</span>
<span class="pun">)));</span>
<span class="typ">String</span>
<span class="pln"> sortName </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"sortName"</span>
<span class="pun">));</span>
<span class="typ">String</span>
<span class="pln"> sortOrder </span>
<span class="pun">=</span> <span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">getAttributeValue</span>
<span class="pun">(</span>
<span class="str">"sortOrder"</span>
<span class="pun">));</span>
<span class="typ">Pagination</span>
<span class="pln"> page </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Pagination</span>
<span class="pun">();</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setPageNo</span>
<span class="pun">(</span>
<span class="pln">pageNumber</span>
<span class="pun">);</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setPageSize</span>
<span class="pun">(</span>
<span class="pln">pageSize</span>
<span class="pun">);</span>
<span class="kwd">try</span> <span class="pun">{</span>
<span class="typ">BoolQueryBuilder</span>
<span class="pln"> query </span>
<span class="pun">=</span> <span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">boolQuery</span>
<span class="pun">();</span>
<span class="com">//根据名称查询</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">keyword</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">wildcardQuery</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">,</span> <span class="str">"*"</span> <span class="pun">+</span>
<span class="pln"> keyword </span>
<span class="pun">+</span> <span class="str">"*"</span>
<span class="pun">));</span>
<span class="pun">}</span>
<span class="com">//截止时间大于等于现在</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">).</span>
<span class="pln">gte</span>
<span class="pun">(</span>
<span class="typ">Times</span>
<span class="pun">.</span>
<span class="pln">format</span>
<span class="pun">(</span>
<span class="str">"yyyyMMddHHmmss"</span>
<span class="pun">,</span> <span class="kwd">new</span> <span class="typ">Date</span>
<span class="pun">())));</span>
<span class="com">//公共日期起</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">startDate</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">gte</span>
<span class="pun">(</span>
<span class="pln">startDate</span>
<span class="pun">.</span>
<span class="pln">replaceAll</span>
<span class="pun">(</span>
<span class="str">"-"</span>
<span class="pun">,</span>
<span class="str">""</span>
<span class="pun">)));</span>
<span class="pun">}</span>
<span class="com">//公共日期至</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">endDate</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">rangeQuery</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">lte</span>
<span class="pun">(</span>
<span class="pln">endDate</span>
<span class="pun">.</span>
<span class="pln">replaceAll</span>
<span class="pun">(</span>
<span class="str">"-"</span>
<span class="pun">,</span>
<span class="str">""</span>
<span class="pun">)));</span>
<span class="pun">}</span>
<span class="com">//几个状态条件</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"BUYER_STS"</span>
<span class="pun">,</span> <span class="str">"N"</span>
<span class="pun">));</span>
<span class="com">//采购商状态</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"STS"</span>
<span class="pun">,</span> <span class="str">"A"</span>
<span class="pun">));</span>
<span class="com">//状态</span>
<span class="pln">
query</span>
<span class="pun">.</span>
<span class="pln">must</span>
<span class="pun">(</span>
<span class="typ">QueryBuilders</span>
<span class="pun">.</span>
<span class="pln">matchQuery</span>
<span class="pun">(</span>
<span class="str">"ANNOMK"</span>
<span class="pun">,</span> <span class="str">"Y"</span>
<span class="pun">));</span>
<span class="com">//公告註記</span>
<span class="typ">SearchRequestBuilder</span>
<span class="pln"> srb </span>
<span class="pun">=</span>
<span class="pln"> esService</span>
<span class="pun">.</span>
<span class="pln">getClient</span>
<span class="pun">().</span>
<span class="pln">prepareSearch</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">))</span>
<span class="pun">.</span>
<span class="pln">setSearchType</span>
<span class="pun">(</span>
<span class="typ">SearchType</span>
<span class="pun">.</span>
<span class="pln">DFS_QUERY_THEN_FETCH</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">setTypes</span>
<span class="pun">(</span>
<span class="str">"inquiry"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">setQuery</span>
<span class="pun">(</span>
<span class="pln">query</span>
<span class="pun">)</span>
<span class="com">//分页</span>
<span class="pun">.</span>
<span class="pln">setFrom</span>
<span class="pun">((</span>
<span class="pln">pageNumber </span>
<span class="pun">-</span> <span class="lit">1</span>
<span class="pun">)</span> <span class="pun">*</span>
<span class="pln"> pageSize</span>
<span class="pun">).</span>
<span class="pln">setSize</span>
<span class="pun">(</span>
<span class="pln">pageSize</span>
<span class="pun">)</span>
<span class="com">//是否按匹配度排序</span>
<span class="pun">.</span>
<span class="pln">setExplain</span>
<span class="pun">(</span>
<span class="pln">explain</span>
<span class="pun">);</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="pln">highlight</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="typ">HighlightBuilder</span>
<span class="pln"> highlightBuilder </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">HighlightBuilder</span>
<span class="pun">().</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"*"</span>
<span class="pun">).</span>
<span class="pln">requireFieldMatch</span>
<span class="pun">(</span>
<span class="kwd">false</span>
<span class="pun">);</span>
<span class="pln">
highlightBuilder</span>
<span class="pun">.</span>
<span class="pln">preTags</span>
<span class="pun">(</span>
<span class="str">"<span style=\"color:red\">"</span>
<span class="pun">);</span>
<span class="pln">
highlightBuilder</span>
<span class="pun">.</span>
<span class="pln">postTags</span>
<span class="pun">(</span>
<span class="str">"</span>"</span>
<span class="pun">);</span>
<span class="pln">
srb</span>
<span class="pun">.</span>
<span class="pln">highlighter</span>
<span class="pun">(</span>
<span class="pln">highlightBuilder</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">isNotBlank</span>
<span class="pun">(</span>
<span class="pln">sortName</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="typ">String</span>
<span class="pun">[]</span>
<span class="pln"> sortNames </span>
<span class="pun">=</span> <span class="typ">StringUtils</span>
<span class="pun">.</span>
<span class="pln">split</span>
<span class="pun">(</span>
<span class="pln">sortName</span>
<span class="pun">,</span> <span class="str">","</span>
<span class="pun">);</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="str">"asc"</span>
<span class="pun">.</span>
<span class="pln">equalsIgnoreCase</span>
<span class="pun">(</span>
<span class="pln">sortOrder</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> s </span>
<span class="pun">:</span>
<span class="pln"> sortNames</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
srb</span>
<span class="pun">.</span>
<span class="pln">addSort</span>
<span class="pun">(</span>
<span class="pln">s</span>
<span class="pun">,</span> <span class="typ">SortOrder</span>
<span class="pun">.</span>
<span class="pln">ASC</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span>
<span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> s </span>
<span class="pun">:</span>
<span class="pln"> sortNames</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
srb</span>
<span class="pun">.</span>
<span class="pln">addSort</span>
<span class="pun">(</span>
<span class="pln">s</span>
<span class="pun">,</span> <span class="typ">SortOrder</span>
<span class="pun">.</span>
<span class="pln">DESC</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="pun">}</span>
<span class="pun">}</span>
<span class="pln">
log</span>
<span class="pun">.</span>
<span class="pln">debug</span>
<span class="pun">(</span>
<span class="str">"srb:::\r\n"</span> <span class="pun">+</span>
<span class="pln"> srb</span>
<span class="pun">.</span>
<span class="pln">toString</span>
<span class="pun">());</span>
<span class="typ">SearchResponse</span>
<span class="pln"> response </span>
<span class="pun">=</span>
<span class="pln"> srb</span>
<span class="pun">.</span>
<span class="pln">execute</span>
<span class="pun">().</span>
<span class="pln">actionGet</span>
<span class="pun">();</span>
<span class="typ">SearchHits</span>
<span class="pln"> hits </span>
<span class="pun">=</span>
<span class="pln"> response</span>
<span class="pun">.</span>
<span class="pln">getHits</span>
<span class="pun">();</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setTotalCount</span>
<span class="pun">((</span>
<span class="kwd">int</span>
<span class="pun">)</span>
<span class="pln"> hits</span>
<span class="pun">.</span>
<span class="pln">getTotalHits</span>
<span class="pun">());</span>
<span class="typ">List</span>
<span class="pun"><</span>
<span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">Object</span>
<span class="pun">>></span>
<span class="pln"> list </span>
<span class="pun">=</span> <span class="kwd">new</span> <span class="typ">ArrayList</span>
<span class="pun"><>();</span>
<span class="pln">
hits</span>
<span class="pun">.</span>
<span class="pln">forEach</span>
<span class="pun">(</span>
<span class="pln">searchHit </span>
<span class="pun">-></span> <span class="pun">{</span>
<span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">Object</span>
<span class="pun">></span>
<span class="pln"> source </span>
<span class="pun">=</span>
<span class="pln"> searchHit</span>
<span class="pun">.</span>
<span class="pln">getSourceAsMap</span>
<span class="pun">();</span>
<span class="typ">Map</span>
<span class="pun"><</span>
<span class="typ">String</span>
<span class="pun">,</span> <span class="typ">HighlightField</span>
<span class="pun">></span>
<span class="pln"> highlightFields </span>
<span class="pun">=</span>
<span class="pln"> searchHit</span>
<span class="pun">.</span>
<span class="pln">getHighlightFields</span>
<span class="pun">();</span>
<span class="com">//name高亮</span>
<span class="typ">HighlightField</span>
<span class="pln"> nameField </span>
<span class="pun">=</span>
<span class="pln"> highlightFields</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">);</span>
<span class="kwd">if</span> <span class="pun">(</span>
<span class="pln">nameField </span>
<span class="pun">!=</span> <span class="kwd">null</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="typ">Text</span>
<span class="pun">[]</span>
<span class="pln"> fragments </span>
<span class="pun">=</span>
<span class="pln"> nameField</span>
<span class="pun">.</span>
<span class="pln">fragments</span>
<span class="pun">();</span>
<span class="typ">String</span>
<span class="pln"> tmp </span>
<span class="pun">=</span> <span class="str">""</span>
<span class="pun">;</span>
<span class="kwd">for</span> <span class="pun">(</span>
<span class="typ">Text</span>
<span class="pln"> text </span>
<span class="pun">:</span>
<span class="pln"> fragments</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
tmp </span>
<span class="pun">+=</span>
<span class="pln"> text</span>
<span class="pun">;</span>
<span class="pun">}</span>
<span class="pln">
source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">,</span>
<span class="pln"> tmp</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="pln">
source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">,</span> <span class="typ">YcDateUtil</span>
<span class="pun">.</span>
<span class="pln">get_yyyyMMdd_HHmm</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">))));</span>
<span class="pln">
source</span>
<span class="pun">.</span>
<span class="pln">put</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">,</span> <span class="typ">YcDateUtil</span>
<span class="pun">.</span>
<span class="pln">get_yyyyMMdd</span>
<span class="pun">(</span>
<span class="typ">Strings</span>
<span class="pun">.</span>
<span class="pln">sNull</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">))));</span>
<span class="pln">
list</span>
<span class="pun">.</span>
<span class="pln">add</span>
<span class="pun">(</span>
<span class="pln">source</span>
<span class="pun">);</span>
<span class="pun">});</span>
<span class="pln">
page</span>
<span class="pun">.</span>
<span class="pln">setList</span>
<span class="pun">(</span>
<span class="pln">list</span>
<span class="pun">);</span>
<span class="pun">}</span> <span class="kwd">catch</span> <span class="pun">(</span>
<span class="typ">Exception</span>
<span class="pln"> e</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
e</span>
<span class="pun">.</span>
<span class="pln">printStackTrace</span>
<span class="pun">();</span>
<span class="pun">}</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">binds</span>
<span class="pun">(</span>
<span class="pln">page</span>
<span class="pun">);</span>
<span class="kwd">this</span>
<span class="pun">.</span>
<span class="pln">doBodyRender</span>
<span class="pun">();</span>
<span class="pun">}</span>
<span class="pun">}</span>
前台beetl页面:
<span class="pln"> <#ycold_inquiry_list pageNumber="${pageNumber}" pageSize="${pageSize}" startDate="${startDate}" endDate="${endDate}" keyword="${keyword}" sortName="ANNODAT" sortOrder="desc" highlight="false" var="p">
</span>
<span class="tag"><table</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"list_table_blue even_table"</span>
<span class="tag">></span>
<span class="tag"><thead></span>
<span class="tag"><tr></span>
<span class="tag"><th></span>
<span class="pln">公告日期</span>
<span class="tag"></th></span>
<span class="tag"><th></span>
<span class="pln">案件名称</span>
<span class="tag"></th></span>
<span class="tag"><th></span>
<span class="pln">交货地点</span>
<span class="tag"></th></span>
<span class="tag"><th></span>
<span class="pln">报价截止日期</span>
<span class="tag"></th></span>
<span class="tag"><th</span> <span class="atn">width</span>
<span class="pun">=</span>
<span class="atv">"110"</span>
<span class="tag">></span>
<span class="pln">查看详细</span>
<span class="tag"></th></span>
<span class="tag"></tr></span>
<span class="tag"></thead></span>
<span class="tag"><tbody></span>
<span class="pun"><%</span>
<span class="kwd">for</span>
<span class="pun">(</span>
<span class="pln">o </span>
<span class="kwd">in</span>
<span class="pln"> p</span>
<span class="pun">.</span>
<span class="pln">list</span>
<span class="pun">){</span>
<span class="pln">%>
</span>
<span class="tag"><tr></span>
<span class="tag"><td></span>
<span class="pln">${o.ANNODAT!}</span>
<span class="tag"></td></span>
<span class="tag"><td</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"l_text"</span>
<span class="tag">><a</span> <span class="atn">href</span>
<span class="pun">=</span>
<span class="atv">"${base!}/purchase/info/${o.XUID!}"</span> <span class="atn">target</span>
<span class="pun">=</span>
<span class="atv">"_blank"</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"td_a hide1"</span>
<span class="tag">></span>
<span class="pln">${o.CASNM!}</span>
<span class="tag"></a></span>
<span class="tag"></td></span>
<span class="tag"><td</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"l_text"</span>
<span class="tag">></span>
<span class="pln">${o.DLSITE!}</span>
<span class="tag"></td></span>
<span class="tag"><td></span>
<span class="pln">${o.IQDAT!}</span>
<span class="tag"></td></span>
<span class="tag"><td><a</span> <span class="atn">href</span>
<span class="pun">=</span>
<span class="atv">"${base!}/purchase/info/${o.XUID!}"</span> <span class="atn">target</span>
<span class="pun">=</span>
<span class="atv">"_blank"</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"more_a png"</span>
<span class="tag">></a></td></span>
<span class="tag"></tr></span>
<span class="pun"><%}</span>
<span class="pln">%>
</span>
<span class="tag"></tbody></span>
<span class="tag"></table></span>
<span class="pun"><%</span>
<span class="kwd">if</span>
<span class="pun">(</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalCount</span>
<span class="pun">></span>
<span class="lit">1</span>
<span class="pun">){</span>
<span class="pln">%>
</span>
<span class="tag"><div</span> <span class="atn">class</span>
<span class="pun">=</span>
<span class="atv">"page round_s_a"</span>
<span class="tag">></div></span>
<span class="tag"><script</span> <span class="atn">type</span>
<span class="pun">=</span>
<span class="atv">"text/javascript"</span>
<span class="tag">></span>
<span class="pln">
$</span>
<span class="pun">(</span>
<span class="kwd">function</span> <span class="pun">()</span> <span class="pun">{</span>
<span class="pln">
$</span>
<span class="pun">(</span>
<span class="str">".page"</span>
<span class="pun">).</span>
<span class="pln">createPage</span>
<span class="pun">({</span>
<span class="pln">
pageCount</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalPage</span>
<span class="pun">},</span>
<span class="pln">
totalCount</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">totalCount</span>
<span class="pun">},</span>
<span class="pln">
current</span>
<span class="pun">:</span>
<span class="pln"> $</span>
<span class="pun">{</span>
<span class="pln">p</span>
<span class="pun">.</span>
<span class="pln">pageNo</span>
<span class="pun">},</span>
<span class="pln">
backFn</span>
<span class="pun">:</span> <span class="kwd">function</span> <span class="pun">(</span>
<span class="pln">p</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="pln">
window</span>
<span class="pun">.</span>
<span class="pln">location</span>
<span class="pun">.</span>
<span class="pln">href </span>
<span class="pun">=</span> <span class="str">"?page="</span> <span class="pun">+</span>
<span class="pln"> p </span>
<span class="pun">+</span> <span class="str">"&size=${p.pageSize}"</span>
<span class="pun">;</span>
<span class="pun">}</span>
<span class="pun">});</span>
<span class="pun">});</span>
<span class="tag"></script></span>
<span class="pun"><%}</span>
<span class="pln">%></span>
20181 月21
<span class="kwd">if</span> <span class="pun">(!</span>
<span class="pln">esService</span>
<span class="pun">.</span>
<span class="pln">isExistsType</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">),</span>
<span class="pln"> type</span>
<span class="pun">))</span> <span class="pun">{</span>
<span class="com">//初始化索引表</span>
<span class="typ">XContentBuilder</span>
<span class="pln"> mapping </span>
<span class="pun">=</span>
<span class="pln"> jsonBuilder</span>
<span class="pun">().</span>
<span class="pln">startObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="pln">type</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"_all"</span>
<span class="pun">)</span>
<span class="com">//设置IK分词</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"search_analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"term_vector"</span>
<span class="pun">,</span> <span class="str">"no"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"store"</span>
<span class="pun">,</span> <span class="str">"false"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"properties"</span>
<span class="pun">)</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"CASNM"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"analyzer"</span>
<span class="pun">,</span> <span class="str">"ik_max_word"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"IQDAT"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"index"</span>
<span class="pun">,</span> <span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"fielddata"</span>
<span class="pun">,</span>
<span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">startObject</span>
<span class="pun">(</span>
<span class="str">"ANNODAT"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"type"</span>
<span class="pun">,</span> <span class="str">"text"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"index"</span>
<span class="pun">,</span> <span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">field</span>
<span class="pun">(</span>
<span class="str">"fielddata"</span>
<span class="pun">,</span>
<span class="str">"true"</span>
<span class="pun">).</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">()</span>
<span class="pun">.</span>
<span class="pln">endObject</span>
<span class="pun">();</span>
<span class="pln">
esService</span>
<span class="pun">.</span>
<span class="pln">putMapping</span>
<span class="pun">(</span>
<span class="pln">cfg</span>
<span class="pun">.</span>
<span class="kwd">get</span>
<span class="pun">(</span>
<span class="str">"es.index.name"</span>
<span class="pun">),</span> <span class="str">"inquiry"</span>
<span class="pun">,</span>
<span class="pln"> mapping</span>
<span class="pun">);</span>
<span class="pun">}</span>
<span class="com">/**
* @param indexName 索引名
* @param type 数据类型(表名)
* @param mapping mapping对象
*/</span>
<span class="kwd">public</span> <span class="kwd">boolean</span>
<span class="pln"> putMapping</span>
<span class="pun">(</span>
<span class="typ">String</span>
<span class="pln"> indexName</span>
<span class="pun">,</span> <span class="typ">String</span>
<span class="pln"> type</span>
<span class="pun">,</span> <span class="typ">XContentBuilder</span>
<span class="pln"> mapping</span>
<span class="pun">)</span> <span class="pun">{</span>
<span class="typ">PutMappingRequest</span>
<span class="pln"> mappingRequest </span>
<span class="pun">=</span> <span class="typ">Requests</span>
<span class="pun">.</span>
<span class="pln">putMappingRequest</span>
<span class="pun">(</span>
<span class="pln">indexName</span>
<span class="pun">).</span>
<span class="pln">type</span>
<span class="pun">(</span>
<span class="pln">type</span>
<span class="pun">).</span>
<span class="pln">source</span>
<span class="pun">(</span>
<span class="pln">mapping</span>
<span class="pun">);</span>
<span class="typ">PutMappingResponse</span>
<span class="pln"> response </span>
<span class="pun">=</span>
<span class="pln"> getClient</span>
<span class="pun">().</span>
<span class="pln">admin</span>
<span class="pun">().</span>
<span class="pln">indices</span>
<span class="pun">().</span>
<span class="pln">putMapping</span>
<span class="pun">(</span>
<span class="pln">mappingRequest</span>
<span class="pun">).</span>
<span class="pln">actionGet</span>
<span class="pun">();</span>
<span class="kwd">return</span>
<span class="pln"> response</span>
<span class="pun">.</span>
<span class="pln">isAcknowledged</span>
<span class="pun">();</span>
<span class="pun">}</span>
.field(“fielddata”,”true”) //text字段默认不允许排序,是单独设置数据格式