文档章节

SOLR组合条件查询

泡海椒
 泡海椒
发布于 2017/06/27 10:47
字数 1269
阅读 37
收藏 0

package com.paic.icore.ph.search.biz.service.impl;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocument;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.paic.icore.ph.search.biz.service.SearchUtilService;
import com.paic.icore.ph.search.dto.Condition;
import com.paic.icore.ph.search.dto.SearchResultItem;

import com.paic.icore.ph.util.DateUtil;
import com.paic.pafa.app.biz.service.BaseService;
import com.sun.org.apache.bcel.internal.generic.NEW;

/**
 * 
 * @author EX-GOUDINGCHENG001
 * 
 */
@Component("assemebleSearchResultUtil")
public class AssemebleSearchResultUtil extends BaseService {

    // /**
    // * 根据传入的Condition对象封装成为一个solrQuery
    // *
    // * @param con
    // * @return SolrQuery
    // */
    public static ModifiableSolrParams assembleSolrCondtion(Condition con,
            ArrayList<String> deptList) {
        ModifiableSolrParams query = new ModifiableSolrParams();
        SolrQuery filterQuery = new SolrQuery();
        if (null == con.getKeyword()) {
            query.add("q", "keyword:*");
        } else {
            query.add("q", "keyword:" + con.getKeyword() + "");
        }
        if (null != con.getProffession()) {
            String string = con.getProffession().substring(0, con.getProffession().length()-1);
            filterQuery.addFilterQuery("pproffession:"
                    + string + "");
        }

        if (null != con.getFiletype()) {
            filterQuery.addFilterQuery("filetype:"
                    + con.getFiletype() + "");
        }

        if (null != con.getProffession1()) {
            String string = con.getProffession1().substring(0, con.getProffession1().length()-1);
            filterQuery.addFilterQuery("proffession:"
                    + string + "");
        }
        
        if (null == con.getOrganization()
                || "".equalsIgnoreCase(con.getOrganization())) {

        } else {
        
            filterQuery.addFilterQuery("organization:"
                    + con.getOrganization() + "");
        }
        
        // 查询一天内的数据
        if ("week".equalsIgnoreCase(con.getDuring())) {
            filterQuery.addFilterQuery("day:[NOW/DAY-7DAY TO NOW/DAY]");
        }
        // 查询一周内的数据
        if ("month".equalsIgnoreCase(con.getDuring())) {
            filterQuery.addFilterQuery("day:[NOW/DAY-1MONTH TO NOW/DAY]");

        }
        // 查询近一年的数据
        if ("year".equalsIgnoreCase(con.getDuring())) {
            filterQuery.addFilterQuery("day:[NOW/DAY-1YEAR TO NOW/DAY]");
        }

        if ("heated".equalsIgnoreCase(con.getOderBy())) {
            query.add("sort", "day desc");
        }
        if ("atime".equalsIgnoreCase(con.getOderBy())) {
            query.add("sort", "day desc");
        }
        if ("algorithm".equalsIgnoreCase(con.getOderBy())) {
            query.add("sort", "day desc");
        }
        query.add("sort", "day desc");
        int startRow = ((int) con.getPage() == 0) ? 0 : (con.getPage() - 1)
                * con.getMaxResults();
        query.add("start", String.valueOf(startRow));
        query.add("rows", String.valueOf(con.getMaxResults()));
        query.add(filterQuery);
        // 设置高亮信息

//        query.add("hl", "true");// 高亮开关
//        query.add("hl.fl", "title,content");// 高亮返回字段
//        query.add("hl.fragsize", "150");// 高亮字段长度,0代表返回全部
//        query.add("hl.encoder", "html");
//        query.add("hl.fragmenter", "regex");
//        query.add("hl.useFastVectorHighlighter", "true");
//        query.add("f.content.hl.alternateField", "description");
//        query.add("f.content.hl.maxAlternateFieldLength", "150");
        // 对经验的可见性进行处理

        if ("ROLE_PH_SYS_MANAGER".equalsIgnoreCase(con.getRolecode())) {
            // 如果是超级管理员,全部可见
            if ("all".equalsIgnoreCase(con.getType()) || null == con.getType()) {
                filterQuery.addFilterQuery("type:*");
            } else {
                filterQuery.addFilterQuery("type:" + con.getType());
            }
        } else if("ROLE_PH_DEPT_MANAGER".equalsIgnoreCase(con.getRolecode())){//
            
            String string="(NOT visiflag:1 AND (";
            StringBuffer visibilitycontent = new StringBuffer();
            if (deptList.size() > 0) {
                //如果指定的人可见中包含有自己的UMCODE        
                visibilitycontent.append("visiInstitution:"+con.getUmCode()+" OR ");
                for (int i = 0; i < deptList.size(); i++) {
                    visibilitycontent.append("visiInstitution:"
                            + deptList.get(i).toString() + " OR ");
                }
            } else {
                //如果指定的人可见中包含有自己的UMCODE        
                visibilitycontent.append("visiInstitution:"+con.getUmCode()+" OR ");
                visibilitycontent.append("visiInstitution:' '");
            }
            if (deptList.size() > 0) {
                visibilitycontent.delete(visibilitycontent.length() - 3,
                        visibilitycontent.length());
            }
            visibilitycontent.append("))");
            visibilitycontent.append("OR (visiflag:1)");
        
            // 对用户所处的机构进行查询 处理结束
            string += visibilitycontent.toString();
            System.out.println("String:"+string);

            filterQuery.addFilterQuery(string);
            if (null != con.getType()) {
                if ("all".equalsIgnoreCase(con.getType())) {
                    filterQuery.addFilterQuery( "type:*");
                } else {
                    filterQuery.addFilterQuery("type:" + con.getType() + "");
                }
            }

        }else if("ROLE_PH_KNG_MANAGER".equalsIgnoreCase(con.getRolecode())){
            String string="(NOT visiflag:1 AND (";
            StringBuffer visibilitycontent = new StringBuffer();
            if (deptList.size() > 0) {
                //如果指定的人可见中包含有自己的UMCODE        
                visibilitycontent.append("visiInstitution:"+con.getUmCode()+" OR ");
                for (int i = 0; i < deptList.size(); i++) {
                    visibilitycontent.append("visiInstitution:"
                            + deptList.get(i).toString() + " OR ");
                }
            } else {
                //如果指定的人可见中包含有自己的UMCODE        
                visibilitycontent.append("visiInstitution:"+con.getUmCode()+" OR ");
                visibilitycontent.append("visiInstitution:' '");
            }
            if (deptList.size() > 0) {
                visibilitycontent.delete(visibilitycontent.length() - 3,
                        visibilitycontent.length());
            }
            visibilitycontent.append("))");
            visibilitycontent.append("OR (visiflag:1)");
        
            // 对用户所处的机构进行查询 处理结束
            string += visibilitycontent.toString();
            System.out.println("String:"+string);
            String type=con.getType();
            filterQuery.addFilterQuery(string);
            if (null != type) {
                if ("all".equalsIgnoreCase(con.getType())||null==con.getType()) {
                    filterQuery.addFilterQuery( "type:wenwen OR type:yunpan OR (type:jingyan AND visiInstitution:"+con.getUmCode()+") OR user:"+con.getUmCode()+"");
                } else if("wenwen".equalsIgnoreCase(con.getType())) {
                    filterQuery.addFilterQuery("type:"+con.getType());
                }else if("jingyan".equalsIgnoreCase(con.getType())){
                    filterQuery.addFilterQuery("type:jingyan AND visiInstitution:"+con.getUmCode());
                }else if("yunpan".equalsIgnoreCase(con.getType())){
                    filterQuery.addFilterQuery("type:"+con.getType());
                }
            }
        }else if ("ROLE_PH_NORMAL".equalsIgnoreCase(con.getRolecode())) {
            if ("all".equalsIgnoreCase(con.getType()) || null == con.getType()) {
                filterQuery.addFilterQuery("type:*");
                String string="visiInstitution:" + con.getUmCode() + " OR visiflag:1";
                
                if (deptList.size() > 0) {
                    //如果指定的人可见中包含有自己的UMCODE        
                    for (int i = 0; i < deptList.size(); i++) {
                        string+=" OR visiInstitution:"+deptList.get(i);
                    }
                } 
                filterQuery.addFilterQuery(string);
                
                
            } else {
                filterQuery.addFilterQuery("type:" + con.getType());
                String string="visiInstitution:" + con.getUmCode() + " OR visiflag:1";
                if (deptList.size() > 0) {
                    //如果指定的人可见中包含有自己的UMCODE        
                    for (int i = 0; i < deptList.size(); i++) {
                        string+=" OR visiInstitution:"+deptList.get(i);
                    }
                } 
                //filterQuery.addFilterQuery("visiInstitution:" + con.getUmCode() + " OR visiflag:1");
                filterQuery.addFilterQuery(string);
            }
            
            //    filterQuery.addFilterQuery("type:" + con.getType() + "");
        //    filterQuery.addFilterQuery("visiInstitution:" + con.getUmCode() + " OR visiflag:1");
            
            
        }
        query.add(filterQuery);
        System.out.println("query:" + query.toString());
        return query;
    }

    /**
     * 传入一个solrDocument封装成为一个SearchResultItem
     * 
     * @param doc
     * @return SearchResultItem
     */
    public SearchResultItem assembleWenwenResult(SolrDocument doc,
            QueryResponse response) {
        SearchResultItem item = new SearchResultItem();
        if (null != doc.get("id")) {
            item.setId(doc.get("id").toString());// 设置ID
        }
        if (null != doc.get("title")) {
            item.setTitle(doc.get("title").toString());// 设置标题栏
        }
        if (null != doc.get("user")) {
            item.setAskedBy(doc.get("user").toString());// 设置提问人
        }

        if (null != doc.get("acontent")) {
            item.setContent(doc.get("acontent").toString());

        }

        if (null != doc.get("type")) {
            item.setType(doc.get("type").toString());
        }
        String proffesString = "";
        if (null == doc.get("pproffession")) {
            proffesString += "";
        } else {
            proffesString += doc.get("pproffession").toString();
        }
        if (null == doc.get("proffession")) {
            proffesString += "";
        } else {
            proffesString += doc.get("proffession").toString();
        }
        item.setProffession(proffesString);

        Date showDate = (Date) doc.get("day");
        String ttString = DateUtil.getShowDate(showDate);
        item.setPublishDateStr(DateUtil.getShowDate(showDate));
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("title");
            if (highlightSnippets != null) {
                item.setTitle(StringUtils.join(highlightSnippets.iterator(), ""));
            }

        }
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("acontent");
            if (highlightSnippets != null) {
                item.setContent(StringUtils.join(highlightSnippets.iterator(),
                        ""));
            }

        }
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("desc");
            if (highlightSnippets != null) {
                item.setContent(StringUtils.join(highlightSnippets.iterator(),
                        ""));
            }

        }

        return item;
    }

    public SearchResultItem assembleJinyanResult(SolrDocument doc,
            QueryResponse response) {
        SearchResultItem item = new SearchResultItem();
        if (null != doc.get("id")) {
            item.setId(doc.get("id").toString());// 设置ID
        }
        if (null != doc.get("title")) {
        
            item.setTitle(doc.get("title").toString());// 设置标题栏
        }
        if (null != doc.get("user")) {
        
            item.setAskedBy(doc.get("user").toString());// 设置提问人
        }

        if (null != doc.get("desc")) {
    
            item.setContent(doc.get("desc").toString());
        }

        if (null != doc.get("type")) {

            item.setType(doc.get("type").toString());
        }
        if (null != doc.get("day")) {
            Date showDate = (Date) doc.get("day");
            String ttString = DateUtil.getShowDate(showDate);
            item.setPublishDateStr(DateUtil.getShowDate(showDate));

        }
        String proffesString = "";
        if (null == doc.get("pproffession")) {
            proffesString += "";
        } else {
            proffesString += doc.get("pproffession").toString();
        }
        if (null == doc.get("proffession")) {
            proffesString += "";
        } else {
            proffesString += doc.get("proffession").toString();
        }
        item.setProffession(proffesString);
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("title");
            if (highlightSnippets != null) {
                item.setTitle(StringUtils.join(highlightSnippets.iterator(), ""));
            }

        }
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("acontent");
            if (highlightSnippets != null) {
                item.setContent(StringUtils.join(highlightSnippets.iterator(),
                        ""));
            }
        }
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("desc");
            if (highlightSnippets != null) {
                item.setContent(StringUtils.join(highlightSnippets.iterator(),
                        ""));
            }
        }

        return item;

    }
    
    
    public SearchResultItem assembleYunpanResult(SolrDocument doc,
            QueryResponse response) {
        SearchResultItem item = new SearchResultItem();
        if (null != doc.get("id")) {
            item.setId(doc.get("id").toString());// 设置ID
        }
        if (null != doc.get("title")) {

            item.setTitle(doc.get("title").toString());// 设置标题栏
        }
        if (null != doc.get("user")) {

            item.setAskedBy(doc.get("user").toString());// 设置提问人
        }

        if (null != doc.get("desc")) {

            item.setContent(doc.get("desc").toString());
        }

        if (null != doc.get("type")) {
    
            item.setType(doc.get("type").toString());
        }
        if (null != doc.get("day")) {
            Date showDate = (Date) doc.get("day");
            String ttString = DateUtil.getShowDate(showDate);
            item.setPublishDateStr(DateUtil.getShowDate(showDate));

        }
        String proffesString = "";
        if (null == doc.get("pproffession")) {
            proffesString += "";
        } else {
            proffesString += doc.get("pproffession").toString();
        }
        if (null == doc.get("proffession")) {
            proffesString += "";
        } else {
            proffesString += doc.get("proffession").toString();
        }
        item.setProffession(proffesString);
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("title");
            if (highlightSnippets != null) {
                item.setTitle(StringUtils.join(highlightSnippets.iterator(), ""));
            }

        }
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("acontent");
            if (highlightSnippets != null) {
                item.setContent(StringUtils.join(highlightSnippets.iterator(),
                        ""));
            }
        }
        if (response.getHighlighting() != null
                && response.getHighlighting().get(item.getId()) != null) {
            List<String> highlightSnippets = response.getHighlighting()
                    .get(item.getId()).get("desc");
            if (highlightSnippets != null) {
                item.setContent(StringUtils.join(highlightSnippets.iterator(),
                        ""));
            }
        }

        return item;

    }

}
 

© 著作权归作者所有

共有 人打赏支持
泡海椒
粉丝 11
博文 278
码字总数 286768
作品 0
成都
程序员
私信 提问
JAVAEE——Solr:安装及配置、后台管理索引库、 使用SolrJ管理索引库、仿京东的电商搜索案例实现

1 学习回顾 1、 Lucene 是Apache开源的全文检索的工具包 创建索引 查询索引 2、 遇到问题? 文件名 及文件内容 顺序扫描法 全文检索 3、 什么是全文检索? 这种先创建索引 再对索引进行搜索的...

kent鹏
2018/07/16
0
0
solr4.7开发实践 3——分组查询facet

solr将以导航为目的的查询结果称为facet. 它并不会修改查询结果信息, 只是在查询结果上根据分类添加了count信息, 然后用户根据count信息做进一步的查询, 比如淘宝的查询列表中, 上面会表示不...

一枚Sir
2014/04/15
0
0
一步一步学solr:在开始前我们应该明白什么

我就用自己的项目来讲solr应用了,当然他的功能很多,大家可以看这里 http://my.oschina.net/fengnote/blog/288581 功能那是相当的多。 solr可以理解为与应用分离的一个搜索服务,我们要搭建...

王爵nice
2014/07/23
0
0
基于solr实现hbase的二级索引

基于solr实现hbase的二级索引 [X] 目的: 由于hbase基于行健有序存储,在查询时使用行健十分高效,然后想要实现关系型数据库那样可以随意组合的、、等就比较麻烦了。想要实现这样的功能,我们可...

白石
2015/01/16
0
7
Spring Data Solr 教程: 排序

当实现一个字符查询功能时,一般都会以搜索结果的质量高低来降序显示 relevancy of each search result. 这也正是Solr的做法。 然而,有时也需要采用手工干预的方式来调整展示顺序。其中一个...

lwei
2014/02/17
11.1K
4

没有更多内容

加载失败,请刷新页面

加载更多

Navicat怎样导入Excel表格和txt文本的数据

Navicat怎样导入Excel表格和txt文本的数据 2018年07月02日 11:29:11 零碎de記憶 阅读数:2433 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39135287/ar...

linjin200
6分钟前
0
0
使用MaxCompute Java SDK运行安全相关命令

使用MaxCompute Console的同学,可能都使用过MaxCompute安全相关的命令。官方文档上有详细的MaxCompute 安全指南 ,并给出了安全相关语句汇总 。 简而言之, 权限管理 、 列级别访问控制 、 ...

阿里云云栖社区
10分钟前
0
0
中小公司的Java工程师应该如何逆袭冲进BAT?

(1)80% Java工程师都有的迷茫 这篇文章,跟大家聊一聊很多很多很多人问我的一个问题:中小公司的Java工程师应该如何规划准备,才能跳槽进入BAT这类一线互联网公司? 之所以我用了三个 “很...

Java填坑路
11分钟前
1
0
你的应用够安全吗?绿标2.0隐私权限详解

近日,最新一期的《绿色应用达标率调查报告》结果显示,应用在安全方面的通过率仅为57%,相较于其他四项标准通过率最低。其中隐私权限的过度获取是主要原因之一,需要开发者尽快完成整改。 ...

安卓绿色联盟
21分钟前
0
0
使用MaxCompute Java SDK运行安全相关命令

使用MaxCompute Console的同学,可能都使用过MaxCompute安全相关的命令。官方文档上有详细的MaxCompute安全指南,并给出了安全相关语句汇总。 简而言之,权限管理、列级别访问控制、项目空间...

阿里云官方博客
26分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部