Kaynağa Gözat

filter goods' status only when go_id is not null

sunyj 7 yıl önce
ebeveyn
işleme
da9e3869b5

+ 14 - 1
mall-search/src/main/java/com/uas/search/service/impl/SearchServiceImpl.java

@@ -989,7 +989,20 @@ public class SearchServiceImpl implements SearchService {
 
         // 筛选状态
         if (!StringUtils.isEmpty(filters.get(FilterField.GOODS_STATUS))) {
-            filter(filters.get(FilterField.GOODS_STATUS), SearchConstants.GOODS_GO_STATUS_FIELD, query);
+            // 批次 id 不为空时,对状态过滤
+            Query goIdNotNullQuery = SearchUtils.getNotNullQuery(SearchConstants.GOODS_GO_ID_FIELD);
+            BooleanQuery q1 = new BooleanQuery();
+            q1.add(goIdNotNullQuery, Occur.MUST);
+            filter(filters.get(FilterField.GOODS_STATUS), SearchConstants.GOODS_GO_STATUS_FIELD, q1);
+            // 或者批次 id 为空(此时是器件)
+            BooleanQuery q2 = new BooleanQuery();
+            q2.add(SearchUtils.getNotNullQuery(SearchConstants.GOODS_CMP_ID_FIELD), Occur.SHOULD);
+            q2.add(goIdNotNullQuery, Occur.MUST_NOT);
+
+            BooleanQuery booleanQuery = new BooleanQuery();
+            booleanQuery.add(q1, Occur.SHOULD);
+            booleanQuery.add(q2, Occur.SHOULD);
+            query.add(booleanQuery, Occur.FILTER);
         }
 
         // 价格筛选

+ 21 - 0
mall-search/src/main/java/com/uas/search/util/SearchUtils.java

@@ -12,6 +12,8 @@ import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
 import org.apache.lucene.document.Document;
 import org.apache.lucene.index.Term;
+import org.apache.lucene.queryparser.classic.ParseException;
+import org.apache.lucene.queryparser.classic.QueryParser;
 import org.apache.lucene.search.BooleanClause.Occur;
 import org.apache.lucene.search.*;
 import org.slf4j.Logger;
@@ -170,6 +172,25 @@ public class SearchUtils {
 		return new RegexpQuery(new Term(field, ".*" + keyword.toLowerCase() + ".*"));
 	}
 
+    /**
+     * 查询值不为空
+     *
+     * @param field
+     *            搜索的域名
+     * @return 构造的查询
+     */
+	public static Query getNotNullQuery(String field){
+        if (StringUtils.isEmpty(field)) {
+            return null;
+        }
+        String query = field + ":[* TO *]";
+        try {
+            return new QueryParser(null, null).parse(query);
+        } catch (ParseException e) {
+            throw new IllegalStateException("查询语法错误:" + query);
+        }
+    }
+
 	/**
 	 * 获取指定表的IndexSearcher对象,若为空,抛出异常
 	 *