【Solr4.7.0学习笔记】系列之一:solr 竞价排名

先修改配置文件
1)mysql-data-config.xml
sid和sql查询的别名一样,id是该域的别名在后面的schema.xml创建域会用到;
修改entity的name和pid尽量不要用id可以任意的取名字区别开
<dataConfig>  
    <dataSource type="JdbcDataSource" driver="com.mysql.jdbc.Driver" url="jdbc:mysql://localhost:3306/sshdb" user="root" password="root" />   
    <document>  

<entity name="test" query="select s.sno ,s.sno as sid,s.sname,c.classid,c.classname,c.classname as cname from student  s left join classify  c on s.classid=c.classid" pk="mypk">  
            <field column="SNO" name="sNo"/>   
<field column="sid" name="id"/>   
            <field column="SNAME" name="sName"/>   
<field column="CLASSID" name="classId"/>   
            <field column="CLASSNAME" name="className"/>  
<field column="CNAME" name="cName"/>    
        </entity>
       <!-- <entity name="id_stu" query="select SNO,SNAME,SAGE from STUDENT" pk="ID_stu">  
  
            <field column="SNO" name="sNo"/>   
            <field column="SNAME" name="sName"/>   
            <field column="SAGE" name="sAge"/>   
        </entity>  
<entity name="id_classid" query="select CLASSID,CLASSNAME from CLASSIFY" pk="ID_classid">  
            <field column="CLASSID" name="classId"/>   
            <field column="CLASSNAME" name="className"/>            
        </entity>  
-->
    </document>  
</dataConfig>

2)schema.xml
新配两个域,一个是text类型是分词器类型;一个是id作为名字跟mysql-data-config.xml里面那个sid的别名id对应。
<fields>   
  <field name="china_Text" type="text_ik" indexed="true" stored="true"/>
  <field name="sNo"  type="int" indexed="true" stored="true" /> 
  <field name="_version_" type="long"     indexed="true"  stored="true"/>   
  
  <field name="classId" type="int" indexed="true" stored="false" />  
  <field name="className" type="text_general" indexed="true" stored="true" />  
  <field name="cName" type="string" indexed="true" stored="false" />  
  
  <field name="id" type="string" indexed="true" stored="false" required="true" multiValued="false"/>  
   <field name="sName" type="text_ik" indexed="true" stored="false" multiValued="true"/>   
  <field name="text" type="text_ik" indexed="true" stored="true" />  
  <copyField source="sName" dest="text" /> 
 </fields>
 


 <uniqueKey>sNo</uniqueKey> 
 <defaultSearchField>text</defaultSearchField>
 <solrQueryParser defaultOperator="OR"/>


3)solrconfig.xml
从collection1里面拷贝这样一段代码放到coretest2的solrconfig.xml文件里面不需要修改任何东西
  <searchComponent name="elevator" class="org.apache.solr.handler.component.QueryElevationComponent" >
    <str name="queryFieldType">string</str>
    <str name="config-file">elevate.xml</str>
     </searchComponent>    
       <requestHandler name="/elevate" class="org.apache.solr.handler.component.SearchHandler" startup="lazy">
        <lst name="defaults">
            <str name="echoParams">explicit</str>
         </lst>
         <arr name="last-components">
            <str>elevator</str>
         </arr>
  </requestHandler>
  
4)elevate.xml
到collection1里面拷贝一个elevate.xml文件。修改点东西
<?xml version="1.0" encoding="UTF-8" ?>
<elevate>
 <!--<query text="foo bar">
  <doc id="1" />
  <doc id="2" />
  <doc id="3" />
 </query>
 --> 
 <query text="陈奕迅">
  
   <doc id="5" /> <!-- exclude this cable -->
   <doc id="11" /> <!-- exclude this cable -->
   <!-- <doc id="5" exclude="true" />  true表示这一行不可见-->
 </query>
 
</elevate>
查询的时候不是/select 修改为/elevate,这是你配置的那个xml的节点
效果:(这时候“陈奕迅”就是text字段而非sName字段里面的,即使你elevate里面没有配置,<doc  id ='11'/><doc  id ='5'/> 他也可以把含有陈奕迅的查出来)

5)最后修改java代码
注意:虽然需要查询的是sName字段,可是我们在竞价排名的时候吧sName设置为不可存储而高亮是需要存储的,这时候利用text来查询设置高亮。
整个方法代码如下:
//竞价排名
       public  List<UserInfo> jingjiaSort(String userName, int  i){
            //智能分词-----------------------
                   CharTermAttribute ta=  null  ;   
                   String params=  ""  ;
                     try  {              
                        IKAnalyzer analyzer =  new  IKAnalyzer();        
                          //使用智能分词
                        analyzer.setUseSmart(  true  );
                        TokenStream Stream = analyzer.tokenStream( "text"  new  StringReader(userName));          
                        ta=Stream.addAttribute(CharTermAttribute.  class  );
                        Stream.reset();              
                          for  (;Stream.incrementToken(); ) {
                             params +=  "text:"  +ta+ " OR "  ;                   
                        }
                        Stream.end();
                   }  catch  (IOException e1) {            
                        e1.printStackTrace();
                   }
                     //-----------------------------end
                   List<UserInfo> list=  new  ArrayList<UserInfo>();
                   UserInfo user=  null  ;
                   HttpSolrServer server=SolrServer.getInstance ().getServer ();
                   SolrQuery query=  new  SolrQuery();      
                   String para=  ""  ;
                     if  (params !=  null ){
                          if  (params.lastIndexOf( "OR"  ) != -1)
                             params= params.substring(0,params.lastIndexOf( "OR"  ));
                        para=params;
                   }    
                     //竞价排名
                   query.set( "q" , para);
                   query.set( "qt" ,"/elevate" );
                   query.set( "enableElevation" ,true );
                   query.set( "forceElevation" , true );                   
                        
                  query.setStart(i);  //设置"其实位置":表示从结果集的第几条数据开始显示。默认下标是0开始
                  query.setRows(10);  //设置每页显示的行数          
                   //设置高亮显示---------------------
                  query.setHighlight(  true  ); //开启高亮功能        
                  query.addHighlightField(  "text"  ); //高亮字段
                  query.setHighlightSimplePre(  "<font color=\"red\">" );  //渲染标签
                  query.setHighlightSimplePost( "</font>"  );  //渲染标签
                  QueryResponse response;
                   try  {
                   response=server.query(query);                  
                   SolrDocumentList dlist=response.getResults();         
                     //第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名 
                   Map<String, Map<String, List<String>>> map = response.getHighlighting();        
                     for  ( int  j=0;j<dlist.size();j++){
                        user=  new  UserInfo();
                        SolrDocument d=dlist.get(j);  //获取每一个document                       
                        String sName2=   this .toString (( map.get(((Integer)d.get("sNo" )).toString())).get( "text" )) ;              
                        user.setSname(sName2);            
                        list.add(user);
                   }
                  }  catch  (SolrServerException e) {           
                        e.printStackTrace();
                   }      
                     return  list;
     }

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值