先修改配置文件
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>
<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"/>
<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>
<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>
<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;
}