【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]
先修改配置文件
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]
相关文章推荐
- 帮忙看一下代码有没有内存问题?
- 如何彻底隐藏系统自带的UITabBar
- 不知‘时间复杂度’所云的看过来
- 科讯CMS--使用sql标签在商品内容页调用品牌详情,如品牌名称,图片,介绍等
- jquery validate 详解二
- J2EE 读取文件路径
- 又黑我们程序员!!!!
- C++实现Hash表
- 天气很好
- 设计模式六大原则(1):单一职责原则
- java 集合 应用的小例子
- 黑马程序员_特殊的对象---字符串 、正则表达式、基本数据类型
- c语言 static的作用
- IOS-UITableView-Cell的重绘-避免出现重叠视图
- gethostbyname()函数说明
- 倒数第三行c【i】=0啥意思,为什么去掉就不对了?
- 关于CListCtrl.InsertColumn
- jquery validate 详解一
- Count The Carries
- fzu 2163