[solr] - suggestion
前文使用了SpellCheck做了个自动完成模拟(Solr SpellCheck),使用第一种SpellCheck方式做auto-complete,是基于动态代码方式建立内容,下面方式可通过读文件方式建立内容,并有点击率排序。
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
结果为:
4、在浏览器测试,输入地址:
- http://localhost:8899/solr/mycore/spellcheck?q=中央&rows=0
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());
- }
- }
输出结果:
这里已经根据点击率排好序了。
上面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
结果:
使用代码方式亦同。
[solr] - suggestion的更多相关文章
- solr suggest智能提示配置
目录 配置文件 Java代码 遇到的问题 回到顶部 配置文件 solrconfig.xml <searchComponent name="suggest" class=&qu ...
- 转载:Solr的自动完成实现方式(第三部分:Suggester方式续)
转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269126.html 在之前的两个部分(part1.part2)中,我们学会了如何配置和 ...
- 转载:Solr的自动完成实现方式(第二部分:Suggester方式)
转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269077.html 在Solr的自动完成/自动补充实现介绍(第一部分) 中我介绍了怎么 ...
- [solr] - spell check
solr提供了一个spell check,又叫suggestions,可以用于查询输入的自动完成功能auto-complete. 参考文献: https://cwiki.apache.org/conf ...
- Solr调研总结
http://wiki.apache.org/solr/ Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境 ...
- 【转】solr+ajax智能拼音详解---solr跨域请求
本文转自:http://blog.csdn.net/wangzhaodong001/article/details/8529090 最近刚做完solr的ajax智能拼音.总结一下. 前端:jQuery ...
- solr教程,值得刚接触搜索开发人员一看
http://blog.csdn.net/awj3584/article/details/16963525 Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍sol ...
- Solr总结
http://www.cnblogs.com/guozk/p/3498831.html Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注 ...
- solr拼写检查配置
拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能. 那么什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词,但是 ...
随机推荐
- 第5章 Web自动化测试
5.1 Selenium简介 5.1.1 自动化测试简介 5.1.2 Selenium简介 5.2 Selenium2环境搭建 5.3 Java基础 5.3.1 新建Java工程和类 5.3.2 Ec ...
- Recover Binary Search Tree [LeetCode]
Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...
- 转Global.asax文件
Global.asax 文件是什么 Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序 ...
- HTML 链接<a>标签
定义和用法 <a> 标签定义超链接,用于从一张页面链接到另一张页面. <a> 元素最重要的属性是 href 属性,它指示链接的目标. 在所有浏览器中,链接的默认外观是: 未被访 ...
- jfinal 基本应用 --定时任务 QuartzPlugin
jfinal 的定时器的使用: 项目中使用的maven管理器 1.导入要使用的包 2.添加Job类 配置参数 这个配置是jfinal-quartz 包中带的默认文档,即是默认加载的文档(其中还有一个q ...
- State(状态)
props和state.props是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变. 对于需要改变的数据,我们需要使用state.般来说,你需要在constructor中初始化st ...
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...
- Spring Bean配置
Spring 是什么 •Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. •Spring 是一个 IOC(DI) 和 ...
- [转]解决ubuntu下面putty不能连接RS232串口(USB2COM线)
http://m.blog.csdn.net/blog/wuyanrobert_tjsd/33045255 最后还是sudo了,感觉注销后没有加入dialout组
- Java EE注册三部曲(一步曲)
一步曲(html+servlet+SQL+Bean+Dao+加密(Base64)) 设计思路: 1:编写前台页面jsp:register.jsp,使得用户能够实行注册操作 2:编写servlet:re ...