瀏覽代碼

新增属性过滤功能;创建器件索引时显示进度

sunyj 9 年之前
父節點
當前提交
4a0e2725a2

+ 13 - 0
search-console/pom.xml

@@ -89,6 +89,19 @@
 			<version>2012_v5</version>
 		</dependency>
 		
+		<!-- Lucene实时建索引时用于监听Oracle消息队列 -->
+		<dependency>
+			<groupId>org.oracle</groupId>
+			<artifactId>jmscommon</artifactId>
+			<version>1.0</version>
+		</dependency>
+		<!-- Oracle消息队列处理 -->
+		<dependency>
+			<groupId>org.oracle</groupId>
+			<artifactId>aqapi</artifactId>
+			<version>1.0</version>
+		</dependency>
+		
 		<!-- hibernate -->
 		<dependency>
 			<groupId>org.hibernate</groupId>

+ 1 - 0
search-console/src/main/java/com/uas/search/console/jms/AQListener.java

@@ -71,6 +71,7 @@ public class AQListener {
 
 			// 添加监听器,队列中一旦有消息入队,就会接受该消息(并不是真的实时,一般会有10秒以内的延迟)
 			consumer.setMessageListener(new MessageListener() {
+				@Override
 				public void onMessage(Message message) {
 					AQjmsAdtMessage adtMessage = (AQjmsAdtMessage) message;
 					try {

+ 2 - 0
search-console/src/main/java/com/uas/search/console/jms/QueueMessageTypeFactory.java

@@ -36,6 +36,7 @@ public class QueueMessageTypeFactory implements CustomDatum, CustomDatumFactory
 		return messageFactory;
 	}
 
+	@Override
 	public CustomDatum create(Datum datum, int sqlType) throws SQLException {
 		if (datum == null) {
 			return null;
@@ -45,6 +46,7 @@ public class QueueMessageTypeFactory implements CustomDatum, CustomDatumFactory
 		return queueMessageType;
 	}
 
+	@Override
 	public Datum toDatum(OracleConnection connection) throws SQLException {
 		return struct.toDatum(connection, "QueueMessageTypeFactory");
 	}

+ 24 - 1
search-console/src/main/java/com/uas/search/console/model/ComponentSimpleInfo.java

@@ -1,10 +1,16 @@
 package com.uas.search.console.model;
 
 import java.io.Serializable;
+import java.util.Set;
 
+import javax.persistence.CascadeType;
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.FetchType;
 import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
 import javax.persistence.Table;
 
 /**
@@ -47,6 +53,14 @@ public class ComponentSimpleInfo implements Serializable {
 	@Column(name = "cmp_brid")
 	private Long brandid;
 
+	/**
+	 * 带的属性及属性的值
+	 */
+	@OneToMany(cascade = { CascadeType.PERSIST, CascadeType.REMOVE }, fetch = FetchType.LAZY)
+	@JoinColumn(name = "pv_componentid")
+	@OrderBy("detno")
+	private Set<PropertyValue> properties;
+
 	public Long getId() {
 		return id;
 	}
@@ -79,9 +93,18 @@ public class ComponentSimpleInfo implements Serializable {
 		this.brandid = brandid;
 	}
 
+	public Set<PropertyValue> getProperties() {
+		return properties;
+	}
+
+	public void setProperties(Set<PropertyValue> properties) {
+		this.properties = properties;
+	}
+
 	@Override
 	public String toString() {
-		return "ComponentSimpleInfo [id=" + id + ", code=" + code + ", kindid=" + kindid + ", brandid=" + brandid + "]";
+		return "ComponentSimpleInfo [id=" + id + ", code=" + code + ", kindid=" + kindid + ", brandid=" + brandid
+				+ ", properties=" + properties + "]";
 	}
 
 }

+ 29 - 27
search-console/src/main/java/com/uas/search/console/service/impl/IndexServiceImpl.java

@@ -5,6 +5,7 @@ import java.io.IOException;
 import java.nio.file.Paths;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.lucene.document.Document;
 import org.apache.lucene.document.Field.Store;
@@ -27,6 +28,7 @@ import com.uas.search.console.dao.KindSimpleInfoDao;
 import com.uas.search.console.model.BrandSimpleInfo;
 import com.uas.search.console.model.ComponentSimpleInfo;
 import com.uas.search.console.model.KindSimpleInfo;
+import com.uas.search.console.model.PropertyValue;
 import com.uas.search.console.service.IndexService;
 import com.uas.search.console.support.IndexWriterManager;
 import com.uas.search.console.util.SearchConstants;
@@ -66,6 +68,7 @@ public class IndexServiceImpl implements IndexService {
 		}
 	}
 
+	@Override
 	public Long createIndexs() {
 		try {
 			if (IndexWriter.isLocked(directory)) {
@@ -172,7 +175,10 @@ public class IndexServiceImpl implements IndexService {
 
 		PageInfo info = new PageInfo(params);
 		Page<ComponentSimpleInfo> pageResult = componentDao.findAll(info);
-		while (pageResult.getTotalElements() > size) {
+		long totalElements = pageResult.getTotalElements();
+		System.out.println("Number of components: " + totalElements);
+		double recordProgress = 0;
+		while (totalElements > size) {
 			List<ComponentSimpleInfo> components = pageResult.getContent();
 			for (ComponentSimpleInfo component : components) {
 				Document document = toDocument(component);
@@ -182,6 +188,15 @@ public class IndexServiceImpl implements IndexService {
 			}
 			size += components.size();
 
+			// 器件索引的创建进度(百分比)
+			double indexProgress = size * 100.0 / totalElements;
+			System.out.printf("Component indexed...................%.2f%%\n", indexProgress);
+			// 每创建10%,提交一次,避免内存耗尽,发生OutOfMemoryError
+			if (indexProgress - recordProgress > 10) {
+				indexWriter.commit();
+				recordProgress = indexProgress;
+			}
+
 			page++;
 			params.setPage(page);
 			info = new PageInfo(params);
@@ -245,36 +260,20 @@ public class IndexServiceImpl implements IndexService {
 		// 转小写
 		String code = component.getCode().toLowerCase();
 		document.add(new StringField(SearchConstants.COMPONENT_CODE_FIELD, code, Store.YES));
-
 		document.add(new StringField(SearchConstants.COMPONENT_KINDID_FIELD, String.valueOf(component.getKindid()),
 				Store.YES));
-		// if (component.getKind() != null) {
-		// 不用LongField
-		// document.add(new StringField(SearchConstants.COMPONENT_KINDID_FIELD,
-		// String.valueOf(component.getKind().getId()), Store.YES));
-		// document.add(new
-		// StringField(SearchConstants.COMPONENT_KINDNAME_FIELD,
-		// component.getKind().getNameCn(),
-		// Store.YES));
-		// }
-
 		document.add(new StringField(SearchConstants.COMPONENT_BRANDID_FIELD, String.valueOf(component.getBrandid()),
 				Store.YES));
-				// if (component.getBrand() != null) {
-				// 不用LongField
-				// document.add(new
-				// StringField(SearchConstants.COMPONENT_BRANDID_FIELD,
-				// String.valueOf(component.getBrand().getId()), Store.YES));
-				// document.add(new
-				// StringField(SearchConstants.COMPONENT_BRANDUUID_FIELD,
-				// String.valueOf(component.getBrand().getUuid()), Store.YES));
-				// document.add(new
-				// StringField(SearchConstants.COMPONENT_BRANDNAME_FIELD,
-				// String.valueOf(component.getBrand().getNameCn()),
-				// Store.YES));
-				// }
-
-		// TODO 属性值加入索引
+
+		// 属性值加入索引,索引中field的键:"pr_"前缀连接属性id
+		Set<PropertyValue> propertyValues = component.getProperties();
+		for (PropertyValue propertyValue : propertyValues) {
+			if (!StringUtils.isEmpty(propertyValue.getValue())) {
+				String fieldKey = new StringBuilder(SearchConstants.COMPONENT_PROPERTY_PREFIX)
+						.append(propertyValue.getId()).toString();
+				document.add(new StringField(fieldKey, propertyValue.getValue(), Store.YES));
+			}
+		}
 		return document;
 	}
 
@@ -302,6 +301,7 @@ public class IndexServiceImpl implements IndexService {
 		}
 	}
 
+	@Override
 	public void save(Object obj) {
 		if (obj == null) {
 			return;
@@ -338,6 +338,7 @@ public class IndexServiceImpl implements IndexService {
 		System.out.println("saved object... " + obj + "\n");
 	}
 
+	@Override
 	public void update(Object obj) {
 		if (obj == null) {
 			return;
@@ -379,6 +380,7 @@ public class IndexServiceImpl implements IndexService {
 		System.out.println("updated object... " + obj + "\n");
 	}
 
+	@Override
 	public void delete(Object obj) {
 		if (obj == null) {
 			return;

+ 34 - 5
search-console/src/main/java/com/uas/search/console/service/impl/SearchServiceImpl.java

@@ -48,6 +48,7 @@ public class SearchServiceImpl implements SearchService {
 
 	private static IndexSearcherManager searcherManager = new IndexSearcherManager();
 
+	@Override
 	public List<Long> getKindIds(String keyword) {
 		if (isKeywordInvalid(keyword)) {
 			throw new IllegalArgumentException("搜索关键词无效");
@@ -88,6 +89,7 @@ public class SearchServiceImpl implements SearchService {
 		return ids;
 	}
 
+	@Override
 	public List<Map<String, Object>> getKinds(String keyword) {
 		if (isKeywordInvalid(keyword)) {
 			throw new IllegalArgumentException("搜索关键词无效");
@@ -131,6 +133,7 @@ public class SearchServiceImpl implements SearchService {
 		return kinds;
 	}
 
+	@Override
 	public List<Long> getBrandIds(String keyword) {
 		if (isKeywordInvalid(keyword)) {
 			throw new IllegalArgumentException("搜索关键词无效");
@@ -171,6 +174,7 @@ public class SearchServiceImpl implements SearchService {
 		return ids;
 	}
 
+	@Override
 	public List<Map<String, Object>> getBrands(String keyword) {
 		if (isKeywordInvalid(keyword)) {
 			throw new IllegalArgumentException("搜索关键词无效");
@@ -214,6 +218,7 @@ public class SearchServiceImpl implements SearchService {
 		return brands;
 	}
 
+	@Override
 	public Map<String, Object> getComponentIds(String keyword, PageParams page) {
 		if (isKeywordInvalid(keyword)) {
 			throw new IllegalArgumentException("搜索关键词无效");
@@ -227,6 +232,9 @@ public class SearchServiceImpl implements SearchService {
 			throw new RuntimeException("获取索引文件失败");
 		}
 
+		if (page == null) {
+			page = new PageParams();
+		}
 		if (page.getPage() == 0)
 			page.setPage(1);
 		if (page.getSize() == 0)
@@ -239,17 +247,34 @@ public class SearchServiceImpl implements SearchService {
 			keyword = keyword.toLowerCase();
 			PrefixQuery prefixQuery = new PrefixQuery(new Term(SearchConstants.COMPONENT_CODE_FIELD, keyword));
 			booleanQuery.add(prefixQuery, BooleanClause.Occur.MUST);
-			if (!StringUtils.isEmpty(page.getFilters())) {
-				if (!StringUtils.isEmpty(page.getFilters().get("kindId"))) {// 筛选类目
-					String kindId = String.valueOf(page.getFilters().get("kindId"));
+
+			Map<String, Object> filters = page.getFilters();
+			if (!StringUtils.isEmpty(filters)) {
+				// 筛选类目
+				String kindId = String.valueOf(filters.remove("kindId"));
+				if (!StringUtils.isEmpty(kindId)) {
 					TermQuery kindQuery = new TermQuery(new Term(SearchConstants.COMPONENT_KINDID_FIELD, kindId));
 					booleanQuery.add(kindQuery, BooleanClause.Occur.MUST);
 				}
-				if (!StringUtils.isEmpty(page.getFilters().get("brandId"))) {// 筛选品牌
-					String brandId = String.valueOf(page.getFilters().get("brandId"));
+
+				// 筛选品牌
+				String brandId = String.valueOf(filters.remove("brandId"));
+				if (!StringUtils.isEmpty(brandId)) {
 					TermQuery brandQuery = new TermQuery(new Term(SearchConstants.COMPONENT_BRANDID_FIELD, brandId));
 					booleanQuery.add(brandQuery, BooleanClause.Occur.MUST);
 				}
+
+				// 属性过滤
+				for (String key : filters.keySet()) {
+					if (!key.startsWith(SearchConstants.COMPONENT_PROPERTY_PREFIX)) {
+						key = new StringBuilder(SearchConstants.COMPONENT_PROPERTY_PREFIX).append(key).toString();
+					}
+					String value = String.valueOf(filters.get(key));
+					if (!StringUtils.isEmpty(value)) {
+						TermQuery propertyQuery = new TermQuery(new Term(key, value));
+						booleanQuery.add(propertyQuery, BooleanClause.Occur.MUST);
+					}
+				}
 			}
 
 			TopDocs hits;
@@ -280,6 +305,7 @@ public class SearchServiceImpl implements SearchService {
 		return map;
 	}
 
+	@Override
 	public Set<Long> getKindIdsBySearchComponent(String keyword, String brandId) {
 		if (isKeywordInvalid(keyword)) {
 			throw new IllegalArgumentException("搜索关键词无效");
@@ -324,6 +350,7 @@ public class SearchServiceImpl implements SearchService {
 		return kindIds;
 	}
 
+	@Override
 	public List<Map<String, Object>> getKindsBySearchComponent(String keyword, String brandId) {
 		Set<Long> kindIds = getKindIdsBySearchComponent(keyword, brandId);
 		List<Map<String, Object>> kinds = new ArrayList<Map<String, Object>>();
@@ -361,6 +388,7 @@ public class SearchServiceImpl implements SearchService {
 		return kinds;
 	}
 
+	@Override
 	public Set<Long> getBrandIdsBySearchComponent(String keyword, String kindId) {
 		if (isKeywordInvalid(keyword)) {
 			throw new IllegalArgumentException("搜索关键词无效");
@@ -405,6 +433,7 @@ public class SearchServiceImpl implements SearchService {
 		return brandIds;
 	}
 
+	@Override
 	public List<Map<String, Object>> getBrandsBySearchComponent(String keyword, String kindId) {
 		Set<Long> brandIds = getBrandIdsBySearchComponent(keyword, kindId);
 		List<Map<String, Object>> brands = new ArrayList<Map<String, Object>>();

+ 4 - 0
search-console/src/main/java/com/uas/search/console/util/SearchConstants.java

@@ -76,5 +76,9 @@ public class SearchConstants {
 	public static final String COMPONENT_BRANDID_FIELD = "cmp_brand_id";
 	public static final String COMPONENT_BRANDUUID_FIELD = "cmp_brand_uuid";
 	public static final String COMPONENT_BRANDNAME_FIELD = "cmp_brand_name_cn";
+	/**
+	 * 创建器件属性的索引时,在属性id的前面添加该前缀作为Field的键
+	 */
+	public static final String COMPONENT_PROPERTY_PREFIX = "pr_";
 
 }