elasticsearch spring 集成
elasticsearch.esNodes=localhost:9300
elasticsearch.cluster.name=heroscluster
### \u8bbe\u7f6eLogger\u8f93\u51fa\u7ea7\u522b\u548c\u8f93\u51fa\u76ee\u7684\u5730 ###
log4j.rootLogger=info,logfile
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.Threshold=info
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} - %m%n
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
log4j.appender.logfile.File=/app/logs/mq_consumer.log
log4j.appender.logfile.datePattern='.'yyyy-MM-dd'.'
log4j.appender.logfile.append=true
log4j.appender.logfile.Threshold=debug
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} - %m%n
4.0.0
com.elasticsearch
elasticsearch
war
0.0.1-SNAPSHOT
elasticsearch Maven Webapp
http://maven.apache.org
3.1.1.RELEASE
2.0.0
2.11
3.0
2.5.3
1.7
junit
junit
3.8.1
test
org.springframework
spring-context
${spring.version}
org.springframework
spring-context-support
${spring.version}
org.springframework
spring-aop
${spring.version}
org.springframework
spring-core
${spring.version}
org.springframework
spring-jdbc
${spring.version}
fr.pilato.spring
spring-elasticsearch
1.0.0
org.elasticsearch
elasticsearch
1.0.0
org.springframework.data
spring-data-elasticsearch
1.0.0.RELEASE
com.alibaba
druid
1.0.5
net.sf.json-lib
json-lib
2.4
jdk15
org.quartz-scheduler
quartz
2.2.1
org.slf4j
slf4j-log4j12
1.7.5
elasticsearch
package com.sf.heros.mq.consumer.vo;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldIndex;
import org.springframework.data.elasticsearch.annotations.FieldType;
import com.sf.heros.mq.consumer.utils.APP;
//@Document(indexName = APP.ESProp.INDEX_NAME, type = APP.ESProp.TYPE_TASK_INFO, indexStoreType = APP.ESProp.INDEX_STORE_TYPE, shards = APP.ESProp.SHARDS, replicas = APP.ESProp.REPLICAS, refreshInterval = APP.ESProp.REFRESH_INTERVAL)
@Document(indexName = APP.ESProp.INDEX_NAME, type = APP.ESProp.TYPE_TASK_INFO)
public class TaskInfo {
@Id
@Field(index = FieldIndex.not_analyzed, store = true)
private String taskId;
@Field(type = FieldType.Integer, index = FieldIndex.not_analyzed, store = true)
private Integer userId;
@Field(type = FieldType.String, indexAnalyzer="ik", searchAnalyzer="ik", store = true)
private String taskContent;
@Field(type = FieldType.String, indexAnalyzer="ik", searchAnalyzer="ik", store = true)
private String taskArea;
@Field(type = FieldType.String, indexAnalyzer="ik", searchAnalyzer="ik", store = true)
private String taskTags;
@Field(type = FieldType.Integer, index = FieldIndex.not_analyzed, store = true)
private Integer taskState;
@Field(type = FieldType.String, index = FieldIndex.not_analyzed, store = true)
private String updateTime;
@Field(type = FieldType.String, indexAnalyzer="ik", searchAnalyzer="ik", store = true)
private String userNickName;
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getTaskContent() {
return taskContent;
}
public void setTaskContent(String taskContent) {
this.taskContent = taskContent;
}
public String getTaskArea() {
return taskArea;
}
public void setTaskArea(String taskArea) {
this.taskArea = taskArea;
}
public String getTaskTags() {
return taskTags;
}
public void setTaskTags(String taskTags) {
this.taskTags = taskTags;
}
public Integer getTaskState() {
return taskState;
}
public void setTaskState(Integer taskState) {
this.taskState = taskState;
}
public String getUpdateTime() {
return updateTime;
}
public void setUpdateTime(String updateTime) {
this.updateTime = updateTime;
}
public String getUserNickName() {
return userNickName;
}
public void setUserNickName(String userNickName) {
this.userNickName = userNickName;
}
@Override
public String toString() {
return "TaskInfo [taskId=" + taskId + ", userId=" + userId
+ ", taskContent=" + taskContent + ", taskArea=" + taskArea
+ ", taskState=" + taskState
+ ", updateTime=" + updateTime + ", userNickName="
+ userNickName + "]";
}
public TaskInfo(String taskId, Integer userId, String taskContent,
String taskArea, String taskTags, Integer taskState,
String updateTime, String userNickName) {
this.taskId = taskId;
this.userId = userId;
this.taskContent = taskContent;
this.taskArea = taskArea;
this.taskTags = taskTags;
this.taskState = taskState;
this.updateTime = updateTime;
this.userNickName = userNickName;
}
public TaskInfo() {
// TODO Auto-generated constructor stub
}
}
package com.sf.heros.mq.consumer.utils;
import java.util.HashMap;
import java.util.Map;
public interface APP {
public static final Map map = new HashMap();
public static final String CLOSED_MSG = "#################closed####################";
public static final long DELIVERIED_TAG = -1;
class ESProp {
public static final String INDEX_NAME = "heros";
public static final String DAIDONGXI_INDEX_NAME = "daidongxi";
public static final String TYPE_NEWS_INFO = "news_info";
public static final String TYPE_PRODUCT_INFO = "product_info";
public static final String TYPE_STORY_INFO = "story_info";
public static final String TYPE_TASK_INFO = "task_info";
public static final String TYPE_USER_INFO = "user_info";
public static final String TYPE_BRANDCASE_INFO = "brandcase_info";
public static final String INDEX_STORE_TYPE = "memory";
public static final int SHARDS = 2;
public static final int REPLICAS = 1;
public static final String REFRESH_INTERVAL = "-1";
}
}
/**
*@Pr锛歨eros
*@Date: 2014-5-4 涓婂崍9:21:27
*@Author: seaphy
*@Copyright: 漏 2012 sf-express.com Inc. All rights reserved
*娉ㄦ剰锛氭湰鍐呭浠呴檺浜庨『涓伴�熻繍鍏徃鍐呴儴浼犻槄锛岀姝㈠娉勪互鍙婄敤浜庡叾浠栫殑鍟嗕笟鐩殑
*/
package com.sf.heros.mq.consumer.service;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.elasticsearch.action.ActionFuture;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthRequest;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthResponse;
import org.elasticsearch.action.admin.cluster.health.ClusterHealthStatus;
import org.elasticsearch.client.Client;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.core.query.IndexQuery;
import org.springframework.data.elasticsearch.core.query.IndexQueryBuilder;
import com.sf.heros.mq.consumer.utils.APP;
import com.sf.heros.mq.consumer.vo.BrandCaseInfo;
import com.sf.heros.mq.consumer.vo.NewsInfo;
import com.sf.heros.mq.consumer.vo.TaskInfo;
import com.sf.heros.mq.consumer.vo.UserInfo;
/**
* @author seaphy
* @date 2014-5-4
*/
public class ElasticsearchService {
private static final Logger logger = Logger.getLogger(ElasticsearchService.class);
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private Client esClient;
public void init() {
if (!elasticsearchTemplate.indexExists(APP.ESProp.INDEX_NAME)) {
elasticsearchTemplate.createIndex(APP.ESProp.INDEX_NAME);
}
elasticsearchTemplate.putMapping(TaskInfo.class);
elasticsearchTemplate.putMapping(NewsInfo.class);
}
public boolean update(List taskInfoList) {
List queries = new ArrayList();
for (TaskInfo taskInfo : taskInfoList) {
IndexQuery indexQuery = new IndexQueryBuilder().withId(taskInfo.getTaskId()).withObject(taskInfo).build();
queries.add(indexQuery);
}
elasticsearchTemplate.bulkIndex(queries);
return true;
}
public boolean insertOrUpdateTaskInfo(List taskInfoList) {
List queries = new ArrayList();
for (TaskInfo taskInfo : taskInfoList) {
IndexQuery indexQuery = new IndexQueryBuilder().withId(taskInfo.getTaskId()).withObject(taskInfo).build();
queries.add(indexQuery);
}
elasticsearchTemplate.bulkIndex(queries);
return true;
}
public boolean insertOrUpdateNewsInfo(List newsInfos) {
List queries = new ArrayList();
for (NewsInfo newsInfo : newsInfos) {
IndexQuery indexQuery = new IndexQueryBuilder().withId(newsInfo.getNewsId()).withObject(newsInfo).build();
queries.add(indexQuery);
}
elasticsearchTemplate.bulkIndex(queries);
return true;
}
public boolean insertOrUpdateNewsInfo(NewsInfo newsInfo) {
try {
IndexQuery indexQuery = new IndexQueryBuilder().withId(newsInfo.getNewsId()).withObject(newsInfo).build();
elasticsearchTemplate.index(indexQuery);
return true;
} catch (Exception e) {
logger.error("insert or update news info error.", e);
return false;
}
}
public boolean insertOrUpdateTaskInfo(TaskInfo taskInfo) {
try {
IndexQuery indexQuery = new IndexQueryBuilder().withId(taskInfo.getTaskId()).withObject(taskInfo).build();
elasticsearchTemplate.index(indexQuery);
return true;
} catch (Exception e) {
logger.error("insert or update task info error.", e);
return false;
}
}
public boolean insertOrUpdateUserInfo(UserInfo userInfo) {
try {
IndexQuery indexQuery = new IndexQueryBuilder().withId(userInfo.getUserId()).withObject(userInfo).build();
elasticsearchTemplate.index(indexQuery);
return true;
} catch (Exception e) {
logger.error("insert or update user info error.", e);
return false;
}
}
public boolean deleteById(String id, Class clzz) {
try {
elasticsearchTemplate.delete(clzz, id);
return true;
} catch (Exception e) {
logger.error("delete " + clzz + " by id " + id + " error.", e);
return false;
}
}
/**
* 检查健康状态
* @author 高国藩
* @date 2015年6月15日 下午6:59:47
* @return
*/
public boolean ping() {
try {
ActionFuture health = esClient.admin().cluster().health(new ClusterHealthRequest());
ClusterHealthStatus status = health.actionGet().getStatus();
if (status.value() == ClusterHealthStatus.RED.value()) {
throw new RuntimeException("elasticsearch cluster health status is red.");
}
return true;
} catch (Exception e) {
logger.error("ping elasticsearch error.", e);
return false;
}
}
public boolean insertOrUpdateBrandCaseInfo(BrandCaseInfo brandCaseInfo) {
try {
IndexQuery indexQuery = new IndexQueryBuilder()
.withId(brandCaseInfo.getId()).withObject(brandCaseInfo).build();
elasticsearchTemplate.index(indexQuery);
return true;
} catch (Exception e) {
logger.error("insert or update brandcase info error.", e);
return false;
}
}
}
package com.sf.daidongxi.web.service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.lucene.queries.TermFilter;
import org.apache.lucene.queryparser.xml.builders.FilteredQueryBuilder;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.index.query.BoolFilterBuilder;
import org.elasticsearch.index.query.FilterBuilder;
import org.elasticsearch.index.query.FilterBuilders;
import org.elasticsearch.index.query.MatchQueryBuilder;
import org.elasticsearch.index.query.QueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.index.query.RangeFilterBuilder;
import org.elasticsearch.index.query.TermsQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import sun.misc.Contended;
public class ElasticsearchService implements InitializingBean {
private static final Logger logger = Logger
.getLogger(ElasticsearchService.class);
@Autowired
private Client client;
private String esIndexName = "heros";
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Autowired
private Client esClient;
/** 查询 id */
public List queryId(String type, String[] fields, String content,
String sortField, SortOrder order, int from, int size) {
SearchRequestBuilder reqBuilder = client.prepareSearch(esIndexName)
.setTypes(type).setSearchType(SearchType.DEFAULT)
.setExplain(true);
QueryStringQueryBuilder queryString = QueryBuilders.queryString("\""
+ content + "\"");
for (String k : fields) {
queryString.field(k);
}
queryString.minimumShouldMatch("10");
reqBuilder.setQuery(QueryBuilders.boolQuery().should(queryString))
.setExplain(true);
if (StringUtils.isNotEmpty(sortField) && order != null) {
reqBuilder.addSort(sortField, order);
}
if (from >= 0 && size > 0) {
reqBuilder.setFrom(from).setSize(size);
}
SearchResponse resp = reqBuilder.execute().actionGet();
SearchHit[] hits = resp.getHits().getHits();
ArrayList results = new ArrayList();
for (SearchHit hit : hits) {
results.add(hit.getId());
}
return results;
}
/**
* 查询得到结果为Map集合
*
* @author 高国藩
* @date 2015年6月15日 下午8:46:13
* @param type
* 表
* @param fields
* 字段索引
* @param content
* 查询的值
* @param sortField
* 排序的字段
* @param order
* 排序的規則
* @param from
* 分頁
* @param size
* @return
*/
public List
package com.sf.heros.mq.consumer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.sf.heros.mq.consumer.service.ElasticsearchService;
import com.sf.heros.mq.consumer.utils.APP;
import com.sf.heros.mq.consumer.vo.TaskInfo;
public class AppMain {
private static final Logger logger = Logger.getLogger(AppMain.class);
public void start() {
ClassPathXmlApplicationContext context = null;
try {
context = new ClassPathXmlApplicationContext("classpath:app.xml");
} catch (Exception e) {
logger.error("An error occurred, applicationContext will close.", e);
if (context != null) {
context.close();
}
context = null;
logger.error(APP.CLOSED_MSG);
}
}
/**
* 插入
* @author 高国藩
* @date 2015年6月16日 上午10:14:21
*/
@Test
public void insertNo() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:app.xml");
ElasticsearchService service = context
.getBean(ElasticsearchService.class);
List taskInfoList = new ArrayList();
for (int i = 0; i < 20; i++) {
taskInfoList.add(new TaskInfo(String.valueOf((i + 5)), i + 5, "高国藩"
+ i, "taskArea", "taskTags", i + 5, "1996-02-03", "霍华德"));
}
service.insertOrUpdateTaskInfo(taskInfoList);
}
/**
* 查询
* @author 高国藩
* @date 2015年6月16日 上午10:14:21
*/
@Test
public void serchNo() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:app.xml");
com.sf.daidongxi.web.service.ElasticsearchService service = (com.sf.daidongxi.web.service.ElasticsearchService) context
.getBean("es");
List> al = service.queryForObject("task_info",
new String[] { "taskContent", "taskArea" }, "高国藩", "taskArea", SortOrder.DESC,
0, 2);
for (int i = 0; i < al.size(); i++) {
System.out.println(al.get(i));
}
}
/**
* filter查询
* @author 高国藩
* @date 2015年6月16日 上午10:14:21
*/
@Test
public void serchFilter() {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:app.xml");
com.sf.daidongxi.web.service.ElasticsearchService service = (com.sf.daidongxi.web.service.ElasticsearchService) context
.getBean("es");
List> al = service.queryForObjectForElasticSerch("task_info", "taskContent", "高",19,20);
for (int i = 0; i < al.size(); i++) {
System.out.println(al.get(i));
}
}
}