本次的项目是使用的技术体系有:Spring3.1.1+ Spring mvc3.1.1 +mybatis3.1.1 +oracle + maven + elasticsearch + jdk1.8+slf4j 技术体系新的东西只有es
本次系列主要是用来记录 elasticsearch API java 项目中使用,方便自己记忆。
项目采用maven构建,该项目主要用来方便运营人员从商品库中筛选商品做卖场,及分析销售的商品数据。
项目比较简单分为core,web端,数据表几张
web界面采用freemarker UI
core 提供服务
第一步,清楚项目的需求,目的,项目也很简单,也不用什么开发文档,了解需求就进行实现了。
maven 配置贴下主要是 es的,常用框架的配置不展示了
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.4.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
----------------------------------------------------分割线-------------------------------------------------------------------------
先大致讲下本次项目中使用elasticsearch的步骤:
1,获取elasticsearch的客户端TransportClient
2,建立索引的setting及mapping
3,分页获取数据批量建立索引及索引别名
4,索引查询包含 简单查询termsQuery、组合查询BooleanQuery、区间查询rangeQuery、聚合agg、排序sort、分页scroll、高亮hightlight、关键字搜索keywords、拼音搜索
有位大神很形象的描述使用Elasticsearch 的过程,建立索引 index 相当于我们建立了一个库 db, 建立索引类型 type 相当于我们建立库db 中的表table
索引类型中的document文档 就相当于我们表中的一行记录,文档中所包含的字段就是我们表中的每一列,文档字段的类型就是我们表中列字段的类型。
使用elasticsearch5.4.0 第一步是获取到 代码如下 单利模式:
public class ElasticSearchUtils { private static final Logger LOGGER = LoggerFactory .getLogger(ElasticSearchUtils.class); private ElasticSearchUtils() { } private volatile static TransportClient client; /** * 获取es 客户端 * * @param hosts * 集群IP地址 * @return 客户端实例 */ public static TransportClient getClient(String[] hosts) throws Exception{ if (client == null) { synchronized (ElasticSearchUtils.class) { if (client == null) { Settings settings = Settings.builder() .put("cluster.name", "elasticsearch_lyl").build(); client = new PreBuiltTransportClient(settings); if (hosts.length > 0) { for (String host : hosts) { try { client = client.addTransportAddress( new InetSocketTransportAddress(InetAddress.getByName(host),9300)); } catch (UnknownHostException e) { LOGGER.error("初始化客户端client异常:【{}】.",e); throw e; } } } } } } return client; } public static IndicesAdminClient getIndicesAdminClient( TransportClient client) { return client.admin().indices(); } /** * 创建索引 indexName 相当于创建数据库 indexName * * @param client * @param indexName * @return */ public static boolean createIndex(TransportClient client, String indexName) { if (!isIndexExists(client, indexName)) { CreateIndexResponse response = getIndicesAdminClient(client) .prepareCreate(indexName.toLowerCase()).get(); return response.isAcknowledged(); } LOGGER.info("该索引名称:【{}】已存在.", indexName.toLowerCase()); return Boolean.FALSE; } /** * 为索引创建别名 * * @param client * @param index * @param alias * @return */ public static boolean addAliasIndex(TransportClient client, String indexName, String aliasNmae) { IndicesAliasesResponse response = getIndicesAdminClient(client) .prepareAliases().addAlias(indexName, aliasNmae).get(); LOGGER.info("addAliasIndex 时,索引【{}】,添加别名【{}】状态:【{}】", indexName, aliasNmae, response.isAcknowledged()); return response.isAcknowledged(); }
/** * 判断别名是否存在 * * @param client * @param aliases * @return */ public static boolean isAliasExist(TransportClient client, String... aliases) { AliasesExistResponse response = getIndicesAdminClient(client) .prepareAliasesExist(aliases).get(); return response.isExists(); } /** * //索引删除别名 * * @param client * @param indexName * @param aliasNmae * @return */ public static boolean removeAliasIndex(TransportClient client, String indexName, String aliasNmae) { if (isIndexExists(client, indexName)) { IndicesAliasesResponse response = getIndicesAdminClient(client) .prepareAliases().removeAlias(indexName, aliasNmae).get(); return response.isAcknowledged(); } LOGGER.info("removeAliasIndex时,该索引名称:【{}】不存在.", indexName.toLowerCase()); return Boolean.FALSE; } /** * 创建自定义mapping的索引 前提是得先要创建索引 建立mapping (相当于建立表结构) * * @param client * @param indexName * @param typeName * @param mapping * @return */ public static boolean setIndexMapping(TransportClient client, String indexName, String typeName, String mapping) { PutMappingResponse response = getIndicesAdminClient(client) .preparePutMapping(indexName.toLowerCase()).setType(typeName) .setSource(mapping, XContentType.JSON).get(); return response.isAcknowledged(); } /** * 索引是否存在 * * @param client * @param indexName * @return */ public static boolean isIndexExists(TransportClient client, String indexName) { IndicesExistsRequest request = new IndicesExistsRequest( indexName.toLowerCase()); IndicesExistsResponse response = getIndicesAdminClient(client).exists( request).actionGet(); return response.isExists(); } /** * 删除索引 * * @param client * @param indexName * @return */ public static boolean deleteIndex(TransportClient client, String indexName) { if (isIndexExists(client, indexName)) { DeleteIndexResponse response = getIndicesAdminClient(client) .prepareDelete(indexName.toLowerCase()).get(); return response.isAcknowledged(); } LOGGER.info("deleteIndex时,该索引名称:【{}】不存在.", indexName.toLowerCase()); return Boolean.FALSE; } } 第一部分就完成,不足之处,错误之处望指出; 第二部分是设置setting 其实创建client的时候已经进行了简单的设计setting, 及设置mapping;