[solr] - suggestion
2016-02-15 10:33
197 查看
前文使用了SpellCheck做了个自动完成模拟(Solr SpellCheck),使用第一种SpellCheck方式做auto-complete,是基于动态代码方式建立内容,下面方式可通过读文件方式建立内容,并有点击率排序。
1、在mycore/conf目录下新建一个dictionary.txt文件(UTF-8格式),内容为:
注意上面的“1.0、2.0、3.0”,这就是点击率。以Tab字符(\t)隔开与前面的文字,否则视为普通文本。
2、打开solrconfig.xml文件,加入节点到<config />当中:
在<searchComponent />中关键这句:
3、打开浏览器地址栏输入:
结果为:
![](http://images.cnitblog.com/blog/6088/201409/261404585922715.png)
4、在浏览器测试,输入地址:
![](http://images.cnitblog.com/blog/6088/201409/261407100766585.png)
5、使用代码测试:
输出结果:
![](http://images.cnitblog.com/blog/6088/201409/261409175764537.png)
这里已经根据点击率排好序了。
上面dictionary.txt中有一个“启信”,这不是一个分词,所以如果查询“启”字,是不会有结果的。
加入用户自定义分词方法:
1、打开solr web的目录webapps\solr\WEB-INF\classes,新建一个etc.dic文本文件,内容:
编辑IKAnalyzer.cfg.xml文件:
保存,重启tomcat。
地址栏输入:
结果:
![](http://images.cnitblog.com/blog/6088/201409/261428178269356.png)
使用代码方式亦同。
1、在mycore/conf目录下新建一个dictionary.txt文件(UTF-8格式),内容为:
# sample dict cpu intel I7 1.0 cpu AMD 5000+ 2.0 中央处理器 英特尔 1.0 中央处理器 AMD 2.0 中央空调 海尔 1匹 1.0 中央空调 海尔 1.5匹 2.0 中央空调 海尔 2匹 3.0 中央空调 格力 1匹 4.0 中央空调 格力 1.5匹 5.0 中央空调 格力 2匹 6.0 中央空调 美的 1匹 7.0 中央空调 美的 1.5匹 8.0 中央空调 美的 2匹 9.0 中国中央政府 1.0 中国中央银行 2.0 中国中央人民银行 3.0 启信有限公司 1.0 启信科技有限公司 2.0
注意上面的“1.0、2.0、3.0”,这就是点击率。以Tab字符(\t)隔开与前面的文字,否则视为普通文本。
2、打开solrconfig.xml文件,加入节点到<config />当中:
<searchComponent name="spellcheck" class="solr.SpellCheckComponent"> <lst name="spellchecker"> <str name="name">file</str> <str name="classname">org.apache.solr.spelling.suggest.Suggester</str> <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str> <!-- 下面这个field名字指的是拼写检查的依据,也就是说要根据哪个Field来检查用户输入。 --> <str name="field">content</str> <str name="combineWords">true</str> <str name="breakWords">true</str> <!-- 自动完成提示内容文件 --> <str name="sourceLocation">dictionary.txt</str> <!-- 自动完成提示索引目录,如果不写默认使用内存模式RAMDirectory --> <str name="spellcheckIndexDir">./spellchecker</str> <!-- 何时创建拼写索引:buildOnCommit/buildOnOptimize --> <str name="buildOnCommit">true</str> </lst> </searchComponent> <requestHandler name="/spellcheck" class="org.apache.solr.handler.component.SearchHandler"> <lst name="defaults"> <str name="spellcheck">true</str> <str name="spellcheck.dictionary">file</str> <!-- 提示查询的字符数量 --> <str name="spellcheck.count">20</str> <!-- 使用点击率排序 --> <str name="spellcheck.onlyMorePopular">true</str> </lst> <arr name="last-components"> <str>spellcheck</str> </arr> </requestHandler>
在<searchComponent />中关键这句:
<str name="sourceLocation">dictionary.txt</str>
3、打开浏览器地址栏输入:
http://localhost:8899/solr/mycore/spellcheck?spellcheck.build=true
结果为:
![](http://images.cnitblog.com/blog/6088/201409/261404585922715.png)
4、在浏览器测试,输入地址:
http://localhost:8899/solr/mycore/spellcheck?q=中央&rows=0
![](http://images.cnitblog.com/blog/6088/201409/261407100766585.png)
5、使用代码测试:
package com.my.solr; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; 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.impl.XMLResponseParser; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.client.solrj.response.SpellCheckResponse; import org.apache.solr.client.solrj.response.SpellCheckResponse.Collation; import org.apache.solr.client.solrj.response.SpellCheckResponse.Correction; import org.apache.solr.client.solrj.response.SpellCheckResponse.Suggestion; import com.my.entity.Item; public class TestSolr { public static void main(String[] args) throws IOException, SolrServerException { String url = "http://localhost:8899/solr/mycore"; HttpSolrServer core = new HttpSolrServer(url); core.setMaxRetries(1); core.setConnectionTimeout(5000); core.setParser(new XMLResponseParser()); // binary parser is used by default core.setSoTimeout(1000); // socket read timeout core.setDefaultMaxConnectionsPerHost(100); core.setMaxTotalConnections(100); core.setFollowRedirects(false); // defaults to false core.setAllowCompression(true); // ------------------------------------------------------ // search // ------------------------------------------------------ SolrQuery query = new SolrQuery(); String token = "中央"; query.set("qt", "/spellcheck"); query.set("q", token); query.set("spellcheck", "on"); query.set("spellcheck.build", "true"); query.set("spellcheck.onlyMorePopular", "true"); query.set("spellcheck.count", "100"); query.set("spellcheck.alternativeTermCount", "4"); query.set("spellcheck.onlyMorePopular", "true"); query.set("spellcheck.extendedResults", "true"); query.set("spellcheck.maxResultsForSuggest", "5"); query.set("spellcheck.collate", "true"); query.set("spellcheck.collateExtendedResults", "true"); query.set("spellcheck.maxCollationTries", "5"); query.set("spellcheck.maxCollations", "3"); QueryResponse response = null; try { response = core.query(query); System.out.println("查询耗时:" + response.getQTime()); } catch (SolrServerException e) { System.err.println(e.getMessage()); e.printStackTrace(); } catch (Exception e) { System.err.println(e.getMessage()); e.printStackTrace(); } finally { core.shutdown(); } SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse(); if (spellCheckResponse != null) { List<Suggestion> suggestionList = spellCheckResponse.getSuggestions(); for (Suggestion suggestion : suggestionList) { System.out.println("Suggestions NumFound: " + suggestion.getNumFound()); System.out.println("Token: " + suggestion.getToken()); System.out.print("Suggested: "); List<String> suggestedWordList = suggestion.getAlternatives(); for (String word : suggestedWordList) { System.out.println(word + ", "); } System.out.println(); } System.out.println(); Map<String, Suggestion> suggestedMap = spellCheckResponse.getSuggestionMap(); for (Map.Entry<String, Suggestion> entry : suggestedMap.entrySet()) { System.out.println("suggestionName: " + entry.getKey()); Suggestion suggestion = entry.getValue(); System.out.println("NumFound: " + suggestion.getNumFound()); System.out.println("Token: " + suggestion.getToken()); System.out.print("suggested: "); List<String> suggestedList = suggestion.getAlternatives(); for (String suggestedWord : suggestedList) { System.out.print(suggestedWord + ", "); } System.out.println("\n\n"); } Suggestion suggestion = spellCheckResponse.getSuggestion(token); System.out.println("NumFound: " + suggestion.getNumFound()); System.out.println("Token: " + suggestion.getToken()); System.out.print("suggested: "); List<String> suggestedList = suggestion.getAlternatives(); for (String suggestedWord : suggestedList) { System.out.print(suggestedWord + ", "); } System.out.println("\n\n"); System.out.println("The First suggested word for solr is : " + spellCheckResponse.getFirstSuggestion(token)); System.out.println("\n\n"); List<Collation> collatedList = spellCheckResponse.getCollatedResults(); if (collatedList != null) { for (Collation collation : collatedList) { System.out.println("collated query String: " + collation.getCollationQueryString()); System.out.println("collation Num: " + collation.getNumberOfHits()); List<Correction> correctionList = collation.getMisspellingsAndCorrections(); for (Correction correction : correctionList) { System.out.println("original: " + correction.getOriginal()); System.out.println("correction: " + correction.getCorrection()); } System.out.println(); } } System.out.println(); System.out.println("The Collated word: " + spellCheckResponse.getCollatedResult()); System.out.println(); } System.out.println("查询耗时:" + response.getQTime()); } }
输出结果:
![](http://images.cnitblog.com/blog/6088/201409/261409175764537.png)
这里已经根据点击率排好序了。
上面dictionary.txt中有一个“启信”,这不是一个分词,所以如果查询“启”字,是不会有结果的。
加入用户自定义分词方法:
1、打开solr web的目录webapps\solr\WEB-INF\classes,新建一个etc.dic文本文件,内容:
启信
编辑IKAnalyzer.cfg.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IK Analyzer 扩展配置</comment> <!--用户可以在这里配置自己的扩展字典--> <entry key="ext_dict">ext.dic;</entry> <!--用户可以在这里配置自己的扩展停止词字典--> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
保存,重启tomcat。
地址栏输入:
http://localhost:8899/solr/mycore/spellcheck?q=启&rows=0
结果:
![](http://images.cnitblog.com/blog/6088/201409/261428178269356.png)
使用代码方式亦同。
相关文章推荐
- 缘来缘去缘如尘
- Table表格内容超长时:自动截取、自动换行
- block(代码块)的一部分简单了解(一)
- jquery uploadify上传插件兼容火狐问题
- VS2013 自动添加头部注释 -C#开发
- Swift - 委托(delegate)5秒看懂
- memcached binary protocol
- bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊
- iOS音频处理
- 全面复习之SQL(9)-oracle多表查询,连接查询
- web后台开发入门了解
- quartz spring 实现动态定时任务
- LeetCode -- Min Stack
- 【JSTL】--读取实体成员变量吗?--drp212
- Linux学习笔记:ls命令
- 【转载】为什么无线信号(RSSI)是负值
- Android Studio获取SHA1(获取SHA1的通用方法)
- [solr] - spell check
- 有用的blog
- Linux do some cool things or funny things