elasticsearch spring 集成

elasticsearch spring 集成



项目清单




elasticsearch服务下载包括其中插件和分词


http://download.csdn.net/detail/u014201191/8809619

项目源码


资源文件


app.properties


elasticsearch.esNodes=localhost:9300
elasticsearch.cluster.name=heroscluster


app.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:elasticsearch="http://www.pilato.fr/schema/elasticsearch"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://www.pilato.fr/schema/elasticsearch http://www.pilato.fr/schema/elasticsearch/elasticsearch-0.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
	<context:annotation-config />
	<!-- 自动扫描所有注解该路径 -->
	<!-- <context:component-scan base-package="com.sf.heros.mq.*" /> -->
	<context:property-placeholder location="classpath:/app.properties" />

	<import resource="elasticseach.xml" />
</beans>


elasticseach.xml


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:elasticsearch="http://www.pilato.fr/schema/elasticsearch"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
        http://www.pilato.fr/schema/elasticsearch http://www.pilato.fr/schema/elasticsearch/elasticsearch-0.3.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">

	<util:map id="esproperties">
		<entry key="cluster.name" value="${elasticsearch.cluster.name}" />
	</util:map>

	<elasticsearch:client id="client" properties="esproperties"
		esNodes="${elasticsearch.esNodes}" />

	<bean name="elasticsearchTemplate"
		class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
		<constructor-arg name="client" ref="client" />
	</bean>

	<bean name="elasticsearchService" class="com.sf.heros.mq.consumer.service.ElasticsearchService"
		init-method="init" />

	<bean name="es" class="com.sf.daidongxi.web.service.ElasticsearchService"></bean>
</beans>


log4j.properties


### \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


maven管理


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.elasticsearch</groupId>
	<artifactId>elasticsearch</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>elasticsearch Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<properties>
		<spring.version>3.1.1.RELEASE</spring.version>
		<findbugs.annotations>2.0.0</findbugs.annotations>
		<checkstyle.maven.plugin>2.11</checkstyle.maven.plugin>
		<pmd.maven.plugin>3.0</pmd.maven.plugin>
		<findbugs.maven.plugin>2.5.3</findbugs.maven.plugin>
		<java.version>1.7</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
		<!-- spring begin -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<!-- spring end -->

		<!-- elasticsearch package -->
		<dependency>
			<groupId>fr.pilato.spring</groupId>
			<artifactId>spring-elasticsearch</artifactId>
			<version>1.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.elasticsearch</groupId>
			<artifactId>elasticsearch</artifactId>
			<version>1.0.0</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-elasticsearch</artifactId>
			<version>1.0.0.RELEASE</version>
		</dependency>

		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.0.5</version>
		</dependency>

		<!--json-lib -->
		<dependency>
			<groupId>net.sf.json-lib</groupId>
			<artifactId>json-lib</artifactId>
			<version>2.4</version>
			<classifier>jdk15</classifier>
		</dependency>

		<!-- quartz job -->
		<dependency>
			<groupId>org.quartz-scheduler</groupId>
			<artifactId>quartz</artifactId>
			<version>2.2.1</version>
		</dependency>

		<!-- log4j -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>1.7.5</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>elasticsearch</finalName>
	</build>
</project>


Java.class


Bean配置


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<String, String> map = new HashMap<String, String>();
    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<TaskInfo> taskInfoList) {
        List<IndexQuery> queries = new ArrayList<IndexQuery>();
        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<TaskInfo> taskInfoList) {
        List<IndexQuery> queries = new ArrayList<IndexQuery>();
        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<NewsInfo> newsInfos) {
        List<IndexQuery> queries = new ArrayList<IndexQuery>();
        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 <T> boolean deleteById(String id, Class<T> 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<ClusterHealthResponse> 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<String> 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<String> results = new ArrayList<String>();
		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<Map<String, Object>> queryForObject(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();

		List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
		for (SearchHit hit : hits) {
			results.add(hit.getSource());
		}
		return results;
	}

	/**
	 * QueryBuilders 所有查询入口
	 */
	public List<Map<String, Object>> queryForObjectEq(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().must(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();

		List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
		for (SearchHit hit : hits) {
			results.add(hit.getSource());
		}
		return results;
	}

	/**
	 * 多个文字记不清是那些字,然后放进去查询
	 * 
	 * @author 高国藩
	 * @date 2015年6月16日 上午9:56:08
	 * @param type
	 * @param field
	 * @param countents
	 * @param sortField
	 * @param order
	 * @param from
	 * @param size
	 * @return
	 */
	public List<Map<String, Object>> queryForObjectNotEq(String type,
			String field, Collection<String> countents, String sortField,
			SortOrder order, int from, int size) {

		SearchRequestBuilder reqBuilder = client.prepareSearch(esIndexName)
				.setTypes(type).setSearchType(SearchType.DEFAULT)
				.setExplain(true);
		List<String> contents = new ArrayList<String>();
		for (String content : countents) {
			contents.add("\"" + content + "\"");
		}
		TermsQueryBuilder inQuery = QueryBuilders.inQuery(field, contents);
		inQuery.minimumShouldMatch("10");
		reqBuilder.setQuery(QueryBuilders.boolQuery().mustNot(inQuery))
				.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();

		List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
		for (SearchHit hit : hits) {
			results.add(hit.getSource());
		}
		return results;
	}

	/**
	 * Filters 查询方式
	 * 
	 * 1. 1)QueryBuilders.queryString 获得基本查询
	 *    2)FilteredQueryBuilder query = QueryBuilders.filteredQuery(queryString,FilterBuilder)
	 *    3)通过上面封装成为查询,将这个query插入到reqBuilder中;完成操作
	 *    
	 * 2.在   reqBuilder.setQuery(query);
	 * 
	 * 3.介绍在2)中的FilterBuilder各种构造方式-参数都可以传String类型即可
	 * FilterBuilders.rangeFilter("taskState").lt(20) 小于 、 lte(20) 小于等于
	 * FilterBuilders.rangeFilter("taskState").gt(20)) 大于  、 gte(20) 大于等于
	 * FilterBuilders.rangeFilter("taskState").from(start).to(end)) 范围,也可以指定日期,用字符串就ok了
	 * @author 高国藩
	 * @date 2015年6月15日 下午10:06:05
	 * @param type
	 * @param field
	 * @param countents
	 * @param sortField
	 * @param order
	 * @param from
	 * @param size
	 * @return
	 */
	public List<Map<String, Object>> queryForObjectForElasticSerch(String type,
			String field, String content,int start,int end) {

		SearchRequestBuilder reqBuilder = client.prepareSearch(esIndexName)
				.setTypes(type).setSearchType(SearchType.DEFAULT)
				.setExplain(true);
		QueryStringQueryBuilder queryString = QueryBuilders.queryString("\""
				+ content + "\"");
			queryString.field(field);
		queryString.minimumShouldMatch("10");
		
		reqBuilder.setQuery(QueryBuilders.filteredQuery(queryString, FilterBuilders.rangeFilter("taskState").from(start).to(end)))
				.setExplain(true);

		SearchResponse resp = reqBuilder.execute().actionGet();
		SearchHit[] hits = resp.getHits().getHits();

		List<Map<String, Object>> results = new ArrayList<Map<String, Object>>();
		for (SearchHit hit : hits) {
			results.add(hit.getSource());
		}
		return results;
	}

	public void afterPropertiesSet() throws Exception {
		System.out.println("init...");

	}

}


测试


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<TaskInfo> taskInfoList = new ArrayList<TaskInfo>();
		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<Map<String, Object>> 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<Map<String, Object>> al = service.queryForObjectForElasticSerch("task_info", "taskContent", "高",19,20);

		for (int i = 0; i < al.size(); i++) {
			System.out.println(al.get(i));
		}
		
	}
}


源码项目下载


http://download.csdn.net/detail/u014201191/8812073






评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值