您的位置:首页 > 其它

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

2014-04-16 16:43 507 查看
/article/4856646.html
先修改配置文件
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来查询设置高亮。
整个方法代码如下:

[align=left]//竞价排名[/align]
[align=left] public List<UserInfo> jingjiaSort(String userName,int i){[/align]
[align=left] //智能分词-----------------------[/align]
[align=left] CharTermAttribute ta= null ; [/align]
[align=left] String params= "" ;[/align]
[align=left] try { [/align]
[align=left] IKAnalyzer analyzer = new IKAnalyzer(); [/align]
[align=left] //使用智能分词[/align]
[align=left] analyzer.setUseSmart( true );[/align]
[align=left] TokenStream Stream = analyzer.tokenStream("text" , new StringReader(userName)); [/align]
[align=left] ta=Stream.addAttribute(CharTermAttribute. class );[/align]
[align=left] Stream.reset(); [/align]
[align=left] for (;Stream.incrementToken(); ) {[/align]
params += "text:" +ta+"
OR " ;
[align=left] }[/align]
[align=left] Stream.end();[/align]
[align=left] } catch (IOException e1) { [/align]
[align=left] e1.printStackTrace();[/align]
[align=left] }[/align]
[align=left] //-----------------------------end[/align]
[align=left] List<UserInfo> list= new ArrayList<UserInfo>();[/align]
[align=left] UserInfo user= null ;[/align]
[align=left] HttpSolrServer server=SolrServer.getInstance ().getServer ();[/align]
[align=left] SolrQuery query= new SolrQuery(); [/align]
[align=left] String para= "" ;[/align]
[align=left] if (params != null){[/align]
if (params.lastIndexOf("OR" )
!= -1)
[align=left] params= params.substring(0,params.lastIndexOf("OR" ));[/align]
[align=left] para=params;[/align]
[align=left] } [/align]
[align=left] //竞价排名[/align]
[align=left] query.set( "q" , para);[/align]
[align=left] query.set( "qt" ,"/elevate" );[/align]
[align=left] query.set( "enableElevation" ,true );[/align]
[align=left] query.set( "forceElevation" , true ); [/align]
[align=left][/align]
[align=left] query.setStart(i); //设置"其实位置":表示从结果集的第几条数据开始显示。默认下标是0开始[/align]
[align=left] query.setRows(10); //设置每页显示的行数 [/align]
[align=left] //设置高亮显示---------------------[/align]
query.setHighlight( true );//开启高亮功能

[align=left] query.addHighlightField( "text" );//高亮字段[/align]
[align=left] query.setHighlightSimplePre( "<font color=\"red\">"); //渲染标签[/align]
[align=left] query.setHighlightSimplePost("</font>" ); //渲染标签[/align]
[align=left] QueryResponse response;[/align]
[align=left] try {[/align]
[align=left] response=server.query(query); [/align]
[align=left] SolrDocumentList dlist=response.getResults(); [/align]
[align=left] //第一个Map的键是文档的ID,第二个Map的键是高亮显示的字段名 [/align]
[align=left] Map<String, Map<String, List<String>>> map = response.getHighlighting(); [/align]
[align=left] for (int j=0;j<dlist.size();j++){[/align]
[align=left] user= new UserInfo();[/align]
[align=left] SolrDocument d=dlist.get(j); //获取每一个document [/align]
String sName2= this .toString ((
map.get(((Integer)d.get(
"sNo" )).toString())).get( "text"
)) ;

[align=left] user.setSname(sName2); [/align]
[align=left] list.add(user);[/align]
[align=left] }[/align]
[align=left] } catch (SolrServerException e) { [/align]
[align=left] e.printStackTrace();[/align]
[align=left] } [/align]
[align=left] return list;[/align]
[align=left] }[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: