Solr API例子详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr API例子详解相关的知识,希望对你有一定的参考价值。


package test;

import java.io.IOException;  
import java.net.MalformedURLException;  
import java.text.SimpleDateFormat;
import java.util.ArrayList;  
import java.util.Date;
import java.util.List;   
import java.util.Map;

import org.apache.commons.collections.CollectionUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.util.CollectionUtil;
import org.apache.solr.client.solrj.SolrQuery;  
import org.apache.solr.client.solrj.SolrServerException;  
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField.Count;  
import org.apache.solr.client.solrj.response.QueryResponse;  
import org.apache.solr.common.SolrDocument;  
import org.apache.solr.common.SolrDocumentList;  
import org.apache.solr.common.SolrInputDocument;  
import org.junit.Test;  
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.wltea.analyzer.lucene.IKAnalyzer;

import com.tuke.gospel.core.vo.PaginationSupport;
import com.xd.iis.se.pojos.IContentCommon;
import com.xd.iis.se.pojos.SearchCondition;
import com.xd.intersys.actions.BaseAction;
import com.xd.intersys.ownutils.SolrWbFactory;
import com.xd.intersys.pojo.IContentCommonNet;
import com.xd.intersys.service.facadeImpl.ChartServiceImpl;
import com.xd.intersys.service.facadeImpl.QueryServiceImpl;  
@SuppressWarnings("deprecation")  
public class SolrTest {      
@Autowired
@Qualifier("queryService")
private QueryServiceImpl queryService;
@Autowired
@Qualifier("chartService")
private ChartServiceImpl chartService;

    //指定solr服务器的地址  
    private final static String URL = "http://192.168.20.195:8084/solr/comment";  
    
    @Test  
    public void slorQuery() throws SolrServerException, MalformedURLException{  
        /*
         * //项目取得HttpSolrServer方式 HttpSolrServer
         * server=SolrWbFactory.getSolrServerComment();
         * weibo_comment_solr=http://192.168.20.195:8084/solr/comment
         * weibo_content_comment_solr=http://192.168.20.195:8084/solr/all
         * weibo_content_slor=http://192.168.20.195:8084/solr/collection1
         */
        HttpSolrServer server = new HttpSolrServer(URL);
        /*
         * server.setConnectionTimeout(180 * 1000); server.setSoTimeout(240 *
         * 1000); server.setMaxTotalConnections(1200);
         * server.setDefaultMaxConnectionsPerHost(100); server.setMaxRetries(3);
         * server.setAllowCompression(true);
         */
        // 定义查询字符串
        SolrQuery query = new SolrQuery("Content:*");

        // 设置查询关键字
        /* query.setQuery("Content:* AND Spare3:1 "); */
        // 指定查询返回字段
        /* query.setParam("fl", "Content,IndexTime"); */
        // 设置高亮
        query.setHighlight(true).setHighlightSimplePre("<span class=‘red‘>")
                .setHighlightSimplePost("</span>");
        query.setParam("hl.fl", "Content");

        // 时间条件过滤
        /* query.addFilterQuery("Content:超哥"); */
        /*
         * query.addFilterQuery(
         * "Published:[1995-12-31T23:59:59.999Z TO 2016-03-06T00:00:00Z]");
         */
        query.addFilterQuery("Published:[* TO NOW]");
        // 实现分页的查询
        query.setStart(0);
        query.setRows(10);
        // 设定排序,如果需要对field进行排序就必须在schema.xml中对该field配置stored="true"属性
        query.addSort(IContentCommon.IndexField.Published.getName(),
                SolrQuery.ORDER.asc);

        QueryResponse res = server.query(query);
        // 查询出来的结果都保存在SolrDocumentList中
        SolrDocumentList sdl = res.getResults();
        System.out.println("总数:" + sdl.getNumFound());
    
        System.out.println(sdl.getMaxScore());
        for (SolrDocument sd : sdl) {
               
            String id = (String) sd.get("ID");
            // 打印高亮信息
            System.out.println(res.getHighlighting().get(id).get("Content"));
            //
            System.out.println(sd.get("ID") + "#" + sd.get("Content") + "#"
                    + sd.get("WeiboId") + "#" + sd.get("Published") + "#"
                    + sd.get("OriginType"));

            /* System.out.println(sd.getFieldValue("ID")); */
            Date date = (Date) sd.get("Published");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String dstring = sdf.format(date);
            System.out.println(dstring);
        }
      
    }  
      
    
    
    @Test  
    public void condition() throws SolrServerException, MalformedURLException{  
        SearchCondition sc=new SearchCondition();
        sc.addFilter(null, null);
        sc.addHotsort(true, true);
        BaseAction baseAction=new BaseAction();
        sc=baseAction.getSearchCondition(null, null, 1, "", "", 1, "", 1,1, "", "", 1, "","");
        
        // QueryServiceImpl
        HttpSolrServer solrServer = SolrWbFactory.getSolrServerWb();
        // 通过Search得到SearchCondition
        SolrQuery query = queryService.getQuery(sc);
        /*
         * 实际调用的SearchCondition.toQuery方法lucene的query转换成slor的
         * 实际调用的getSearchBase(HttpSolrServer solrServer, SolrQuery query,
         * SearchCondition searchCondition, Integer page, Integer pagesize)
         * solrServer发送请求查询出来设置到IContentCommonNet对象中
         */
               
   PaginationSupport<IContentCommonNet> paginationSupport=queryService.getSearch(solrServer, query, sc, 1, 10);
    
        chartService.getWordCloud(paginationSupport, 300);
      
    }  
      
    
   /* 
   java对象 <---> xml文件之间的转换
   JAXB注解JAXB能够使用Jackson对JAXB注解的支持实现(jackson-module-jaxb-annotations),既方便生成XML,也方便生成JSON
    @XmlRootElement對类标识自动转化类中有get 、set方法的属性,没有get、set方法的属性无法转化
    @XmlElement对属性标识,属性无需get、set方法
 
     public Analyzer analyzer = new IKAnalyzer(true);//true开启智能分词
         拿IKAnalyzer分词器为例,IKAnalyzer的切分方式是细粒度切分,当不需要智能处理时,
     其就把切出的所有词输出,但若启动了智能处理,那么接下来就是要进行消歧工作。 
  智能分词结果:
    张三|说的|确实|在理
 最细粒度分词结果:
    张三|三|说的|的确|的|确实|实在|在理

(1) TermAttribute: 表示token的字符串信息。比如"I‘m"
(2) TypeAttribute: 表示token的类别信息(在上面讲到)。比如 I‘m 就属于<APOSTROPHE>,有撇号的类型
(3) OffsetAttribute:表示token的首字母和尾字母在原文本中的位置。比如 I‘m 的位置信息就是(0,3)
(4) PositionIncrementAttribute:这个有点特殊,它表示tokenStream中的当前token与前一个token在实际的原文本中相隔的词语数量。
  
  
  
  
  
  
  Math.round 四舍五入Math.round(1.4)=1  Math.round(1.5)=2  
  Math.ceil向上取整Math.ceil(1.4)=2.0  
  Math.floor向下取整
  
    

邮箱:[email protected]

SVN账号密码
账号:yuanhai
密码:cmpz0cUx0p

hbase设置

hbase_server1=192.168.1.120
hbase_server2=192.168.1.121
hbase_server3=192.168.1.122

192.168.1.120 jintai-test-0
192.168.1.121 jintai-test-1
192.168.1.122 jintai-test-2

solr地址:http://192.168.20.195:8084/solr/#/

http://blog.csdn.net/zwx19921215/article/details/41820483

http://www.cnblogs.com/chenz/articles/3229997.html

http://blog.csdn.net/huoyunshen88/article/details/38082455

--------slor日期格式存储----------
TrieDateField  DateField 表示一个精确到毫秒的时间,值的格式是:
YYYY-MM-DD T hh:mm:ss Z

--------------来源类型-------------
BasicContent

-------字符串转换成日期工具类-----------------
DateUtilsIis.parse(strDate,strPattern)

------------错误码类型类-------------------
ErrorCodeConstant

//ArrayList线程安全
List<Map<String,Object>> data=Collections.synchronizedList(new ArrayList<Map<String,Object>>());


-------------监听器------------------
InitDataListener --> springmvc配置的监听器
01449763832357389257242


----------LinkedHashMap-----------
LinkedHashMap实体虽然是以Hash的顺序存放在Map的数组table里面,但是实体之间却用链表的形式保持了存入的先后关系。 
LinkedHashMap保存了记录的插入顺序,所以当你需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列。 
Collections.sort方法对arraylist排序
   
    
    -------字段--------
    Spare3:微博的的层级
    Spare5:父微博的用户名
    CustomFlag1=1疑似负面
    CustomFlag1=2 负面
    CustomFlag1=3 敏感
    CustomFlag1=4 非敏感
    TitleHs 标题哈希   对于微博而言,标题就是内容
    
     UserScreenName 用户名
     ClusterContent   
   
  
    
    splitTypeFlg  xw和app默认不拆分,归到新闻里
    
    newlstSelect   1 为 模糊信息列表;2 表示精确信息列表
    select  =1 全部信息       对应着模糊搜索   newlstSelect=1
    
    *
    *
    */
   
      
      
    /** 
     * 测试分组 
    */ 
    @Test  
    public void facet() throws MalformedURLException, SolrServerException{  
        HttpSolrServer server = new HttpSolrServer(URL);
        SolrQuery query = new SolrQuery("*:*");
        query.setIncludeScore(false);
        query.setFacet(true);
        /* query.addFacetField("Province"); */
        query.addFacetField("Spare3");
        query.addFacetQuery("Spare3:[4 TO 7]");

        /*
         * FacetComponet有两种排序选择,分别是count和index,
         * count是按每个词出现的次数,index是按词的字典顺序。如果查询参数不指定facet.sort,solr默认是按count排序。
         */
        /* query.setFacetSort("index"); */
        query.setFacetSort("count");
        query.setFacetLimit(10);// 设置返回结果条数

        /* query.setFacetPrefix("湖");//设置前缀 */

        System.out.println(query.toString());

        QueryResponse res = server.query(query);
        /* List<Count> provinceList= res.getFacetField("Province").getValues(); */
        List<Count> spare3List = res.getFacetField("Spare3").getValues();

        /*
         * for(Count count : provinceList){
         * System.out.println(count.getName()+"#"+count.getCount());
         * 
         * }
         */
        for (Count count : spare3List) {
            System.out.println(count.getName() + "#" + count.getCount());
        }

        // 得到FacetQuery结果
        Map<String, Integer> facetQueryResult = res.getFacetQuery();

        for (Map.Entry<String, Integer> fqr : facetQueryResult.entrySet()) {
            System.out.println(fqr.getKey() + ":" + fqr.getValue());
        }
      
        res.getFacetDate(null);
        res.getFacetDates();
        res.getFacetRanges();
        /** 
         * 
         * 
         * 
         * 控制台输出结果: 
         *      
         * 
            q=Usergender%3A*&fl=*&facet=true&facet.field=Spare3&facet.query=Spare3%3A%5B4+TO+7%5D&facet.sort=count&facet.limit=10
            0#35389
            4#22778
            3#22333
            2#16567
            1#15571
            6#13161
            5#12339
            7#11550
            8#2659
            9#1399
            Spare3:[4 TO 7]:59828
            
            ---------对应slor图形界面http访问url-----
            http://192.168.20.195:8084/solr/collection1/select?q=Usergender%3A*&
            wt=json&indent=true&facet=true&facet.query=Spare3%3A%5B4+TO+7%5D&facet.field=Spare3
            
            ---------------slor图形界面查询语法------------
            
            
                                                    
             -------------- slor图形界面结果------------  
              
                 
             "facet_counts": {
                "facet_queries": {
                  "Spare3:[4 TO 7]": 59828
                },
                "facet_fields": {
                  "Spare3": [
                    "0",
                    35389,
                    "4",
                    22778,
                    "3",
                    22333,
                    "2",
                    16567,
                    "1",
                    15571,
                    "6",
                    13161,
                    "5",
                    12339,
                    "7",
                    11550,
                    "8",
                    2659,
                    "9",
                    1399,
                    "10",
                    500,
                    "11",
                    187,
                    "12",
                    115,
                    "13",
                    51,
                    "14",
                    34,
                    "15",
                    30,
                    "16",
                    3
                  ]
                },
                "facet_dates": {},
                "facet_ranges": {}
              }
              
              
              
facet.range
http://…/select?&facet=true&facet.range=price&facet.range.start=5000&facet.range.end=8000&facet.range.gap=1000

solrconfig.xml配置
<requestHandler name="/browse" class="solr.SearchHandler" name="/select">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="df">text</str>

str name="facet">on</str>
<str name="facet.range">Price</str>
<int name="f.Price.facet.range.start">0</int>
<int name="f.Price.facet.range.end">5000</int>
<int name="f.Price.facet.range.gap">1000</int>
</lst>
</requestHandler>
     
   facet.range节点中表示按范围分段的字段为Price
   f.Price.facet.range.start表示起始值为0
  f.Price.facet.range.end表示最大值为 5000
  f.Price.facet.range.gap表示每次间隔1000进行分段 ,
         */  
        
        
        
    }  
  
      
      
}


本文出自 “点滴积累” 博客,请务必保留此出处http://tianxingzhe.blog.51cto.com/3390077/1748191

以上是关于Solr API例子详解的主要内容,如果未能解决你的问题,请参考以下文章

solr分布式索引实战分片配置读取:工具类configUtil.java,读取配置代码片段,配置实例

solr 学习片段

Solr 高亮是不是还可以指示返回的片段在原始字段中的位置或偏移量?

Solr Highlighting:如何为同一字段请求多个片段长度?

3.Solr4.10.3目录结构

lucene之filed详解和代码测试