前文使用了SpellCheck做了个自动完成模拟(Solr SpellCheck),使用第一种SpellCheck方式做auto-complete,是基于动态代码方式建立内容,下面方式可通过读文件方式建立内容,并有点击率排序。

1、在mycore/conf目录下新建一个dictionary.txt文件(UTF-8格式),内容为:

  1. # sample dict
  2. cpu intel I7 1.0
  3. cpu AMD 5000+ 2.0
  4. 中央处理器 英特尔 1.0
  5. 中央处理器 AMD 2.0
  6. 中央空调 海尔 1 1.0
  7. 中央空调 海尔 1.5 2.0
  8. 中央空调 海尔 2 3.0
  9. 中央空调 格力 1 4.0
  10. 中央空调 格力 1.5 5.0
  11. 中央空调 格力 2 6.0
  12. 中央空调 美的 1 7.0
  13. 中央空调 美的 1.5 8.0
  14. 中央空调 美的 2 9.0
  15. 中国中央政府 1.0
  16. 中国中央银行 2.0
  17. 中国中央人民银行 3.0
  18. 启信有限公司 1.0
  19. 启信科技有限公司 2.0

注意上面的“1.0、2.0、3.0”,这就是点击率。以Tab字符(\t)隔开与前面的文字,否则视为普通文本。

2、打开solrconfig.xml文件,加入节点到<config />当中:

  1. <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
  2. <lst name="spellchecker">
  3. <str name="name">file</str>
  4. <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
  5. <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
  6. <!-- 下面这个field名字指的是拼写检查的依据,也就是说要根据哪个Field来检查用户输入。 -->
  7. <str name="field">content</str>
  8. <str name="combineWords">true</str>
  9. <str name="breakWords">true</str>
  10. <!-- 自动完成提示内容文件 -->
  11. <str name="sourceLocation">dictionary.txt</str>
  12. <!-- 自动完成提示索引目录,如果不写默认使用内存模式RAMDirectory -->
  13. <str name="spellcheckIndexDir">./spellchecker</str>
  14. <!-- 何时创建拼写索引:buildOnCommit/buildOnOptimize -->
  15. <str name="buildOnCommit">true</str>
  16. </lst>
  17. </searchComponent>
  18. <requestHandler name="/spellcheck" class="org.apache.solr.handler.component.SearchHandler">
  19. <lst name="defaults">
  20. <str name="spellcheck">true</str>
  21. <str name="spellcheck.dictionary">file</str>
  22. <!-- 提示查询的字符数量 -->
  23. <str name="spellcheck.count">20</str>
  24. <!-- 使用点击率排序 -->
  25. <str name="spellcheck.onlyMorePopular">true</str>
  26. </lst>
  27. <arr name="last-components">
  28. <str>spellcheck</str>
  29. </arr>
  30. </requestHandler>

在<searchComponent />中关键这句:

  1. <str name="sourceLocation">dictionary.txt</str>

3、打开浏览器地址栏输入:

  1. http://localhost:8899/solr/mycore/spellcheck?spellcheck.build=true

结果为:

4、在浏览器测试,输入地址:

  1. http://localhost:8899/solr/mycore/spellcheck?q=中央&rows=0

5、使用代码测试:

  1. package com.my.solr;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.Date;
  6. import java.util.List;
  7. import java.util.Map;
  8.  
  9. import org.apache.solr.client.solrj.SolrQuery;
  10. import org.apache.solr.client.solrj.SolrServerException;
  11. import org.apache.solr.client.solrj.impl.HttpSolrServer;
  12. import org.apache.solr.client.solrj.impl.XMLResponseParser;
  13. import org.apache.solr.client.solrj.response.QueryResponse;
  14. import org.apache.solr.client.solrj.response.SpellCheckResponse;
  15. import org.apache.solr.client.solrj.response.SpellCheckResponse.Collation;
  16. import org.apache.solr.client.solrj.response.SpellCheckResponse.Correction;
  17. import org.apache.solr.client.solrj.response.SpellCheckResponse.Suggestion;
  18.  
  19. import com.my.entity.Item;
  20.  
  21. public class TestSolr {
  22.  
  23. public static void main(String[] args) throws IOException, SolrServerException {
  24. String url = "http://localhost:8899/solr/mycore";
  25. HttpSolrServer core = new HttpSolrServer(url);
  26. core.setMaxRetries(1);
  27. core.setConnectionTimeout(5000);
  28. core.setParser(new XMLResponseParser()); // binary parser is used by default
  29. core.setSoTimeout(1000); // socket read timeout
  30. core.setDefaultMaxConnectionsPerHost(100);
  31. core.setMaxTotalConnections(100);
  32. core.setFollowRedirects(false); // defaults to false
  33. core.setAllowCompression(true);
  34.  
  35. // ------------------------------------------------------
  36. // search
  37. // ------------------------------------------------------
  38. SolrQuery query = new SolrQuery();
  39. String token = "中央";
  40. query.set("qt", "/spellcheck");
  41. query.set("q", token);
  42. query.set("spellcheck", "on");
  43. query.set("spellcheck.build", "true");
  44. query.set("spellcheck.onlyMorePopular", "true");
  45.  
  46. query.set("spellcheck.count", "100");
  47. query.set("spellcheck.alternativeTermCount", "4");
  48. query.set("spellcheck.onlyMorePopular", "true");
  49.  
  50. query.set("spellcheck.extendedResults", "true");
  51. query.set("spellcheck.maxResultsForSuggest", "5");
  52.  
  53. query.set("spellcheck.collate", "true");
  54. query.set("spellcheck.collateExtendedResults", "true");
  55. query.set("spellcheck.maxCollationTries", "5");
  56. query.set("spellcheck.maxCollations", "3");
  57.  
  58. QueryResponse response = null;
  59.  
  60. try {
  61. response = core.query(query);
  62. System.out.println("查询耗时:" + response.getQTime());
  63. } catch (SolrServerException e) {
  64. System.err.println(e.getMessage());
  65. e.printStackTrace();
  66. } catch (Exception e) {
  67. System.err.println(e.getMessage());
  68. e.printStackTrace();
  69. } finally {
  70. core.shutdown();
  71. }
  72.  
  73. SpellCheckResponse spellCheckResponse = response.getSpellCheckResponse();
  74. if (spellCheckResponse != null) {
  75. List<Suggestion> suggestionList = spellCheckResponse.getSuggestions();
  76. for (Suggestion suggestion : suggestionList) {
  77. System.out.println("Suggestions NumFound: " + suggestion.getNumFound());
  78. System.out.println("Token: " + suggestion.getToken());
  79. System.out.print("Suggested: ");
  80. List<String> suggestedWordList = suggestion.getAlternatives();
  81. for (String word : suggestedWordList) {
  82. System.out.println(word + ", ");
  83. }
  84. System.out.println();
  85. }
  86. System.out.println();
  87. Map<String, Suggestion> suggestedMap = spellCheckResponse.getSuggestionMap();
  88. for (Map.Entry<String, Suggestion> entry : suggestedMap.entrySet()) {
  89. System.out.println("suggestionName: " + entry.getKey());
  90. Suggestion suggestion = entry.getValue();
  91. System.out.println("NumFound: " + suggestion.getNumFound());
  92. System.out.println("Token: " + suggestion.getToken());
  93. System.out.print("suggested: ");
  94.  
  95. List<String> suggestedList = suggestion.getAlternatives();
  96. for (String suggestedWord : suggestedList) {
  97. System.out.print(suggestedWord + ", ");
  98. }
  99. System.out.println("\n\n");
  100. }
  101.  
  102. Suggestion suggestion = spellCheckResponse.getSuggestion(token);
  103. System.out.println("NumFound: " + suggestion.getNumFound());
  104. System.out.println("Token: " + suggestion.getToken());
  105. System.out.print("suggested: ");
  106. List<String> suggestedList = suggestion.getAlternatives();
  107. for (String suggestedWord : suggestedList) {
  108. System.out.print(suggestedWord + ", ");
  109. }
  110. System.out.println("\n\n");
  111.  
  112. System.out.println("The First suggested word for solr is : " + spellCheckResponse.getFirstSuggestion(token));
  113. System.out.println("\n\n");
  114.  
  115. List<Collation> collatedList = spellCheckResponse.getCollatedResults();
  116. if (collatedList != null) {
  117. for (Collation collation : collatedList) {
  118. System.out.println("collated query String: " + collation.getCollationQueryString());
  119. System.out.println("collation Num: " + collation.getNumberOfHits());
  120. List<Correction> correctionList = collation.getMisspellingsAndCorrections();
  121. for (Correction correction : correctionList) {
  122. System.out.println("original: " + correction.getOriginal());
  123. System.out.println("correction: " + correction.getCorrection());
  124. }
  125. System.out.println();
  126. }
  127. }
  128. System.out.println();
  129. System.out.println("The Collated word: " + spellCheckResponse.getCollatedResult());
  130. System.out.println();
  131. }
  132.  
  133. System.out.println("查询耗时:" + response.getQTime());
  134. }
  135. }

输出结果:

这里已经根据点击率排好序了。


上面dictionary.txt中有一个“启信”,这不是一个分词,所以如果查询“启”字,是不会有结果的。

加入用户自定义分词方法:

1、打开solr web的目录webapps\solr\WEB-INF\classes,新建一个etc.dic文本文件,内容:

  1. 启信

编辑IKAnalyzer.cfg.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
  3. <properties>
  4. <comment>IK Analyzer 扩展配置</comment>
  5. <!--用户可以在这里配置自己的扩展字典-->
  6. <entry key="ext_dict">ext.dic;</entry>
  7.  
  8. <!--用户可以在这里配置自己的扩展停止词字典-->
  9. <entry key="ext_stopwords">stopword.dic;</entry>
  10.  
  11. </properties>

保存,重启tomcat。

地址栏输入:

  1. http://localhost:8899/solr/mycore/spellcheck?q=启&rows=0

结果:

使用代码方式亦同。

[solr] - suggestion的更多相关文章

  1. solr suggest智能提示配置

    目录 配置文件 Java代码 遇到的问题 回到顶部 配置文件 solrconfig.xml <searchComponent name="suggest" class=&qu ...

  2. 转载:Solr的自动完成实现方式(第三部分:Suggester方式续)

    转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269126.html 在之前的两个部分(part1.part2)中,我们学会了如何配置和 ...

  3. 转载:Solr的自动完成实现方式(第二部分:Suggester方式)

    转自:http://www.cnblogs.com/ibook360/archive/2011/11/30/2269077.html 在Solr的自动完成/自动补充实现介绍(第一部分) 中我介绍了怎么 ...

  4. [solr] - spell check

    solr提供了一个spell check,又叫suggestions,可以用于查询输入的自动完成功能auto-complete. 参考文献: https://cwiki.apache.org/conf ...

  5. Solr调研总结

    http://wiki.apache.org/solr/ Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注意事项;主要包括以下内容:环境 ...

  6. 【转】solr+ajax智能拼音详解---solr跨域请求

    本文转自:http://blog.csdn.net/wangzhaodong001/article/details/8529090 最近刚做完solr的ajax智能拼音.总结一下. 前端:jQuery ...

  7. solr教程,值得刚接触搜索开发人员一看

    http://blog.csdn.net/awj3584/article/details/16963525 Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍sol ...

  8. Solr总结

    http://www.cnblogs.com/guozk/p/3498831.html Solr调研总结 开发类型 全文检索相关开发 Solr版本 4.2 文件内容 本文介绍solr的功能使用及相关注 ...

  9. solr拼写检查配置

    拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能. 那么什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词,但是 ...

随机推荐

  1. 第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 ...

  2. Recover Binary Search Tree [LeetCode]

    Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without changing ...

  3. 转Global.asax文件

    Global.asax 文件是什么   Global.asax 文件,有时候叫做 ASP.NET 应用程序文件,提供了一种在一个中心位置响应应用程序级或模块级事件的方法.你可以使用这个文件实现应用程序 ...

  4. HTML 链接<a>标签

    定义和用法 <a> 标签定义超链接,用于从一张页面链接到另一张页面. <a> 元素最重要的属性是 href 属性,它指示链接的目标. 在所有浏览器中,链接的默认外观是: 未被访 ...

  5. jfinal 基本应用 --定时任务 QuartzPlugin

    jfinal 的定时器的使用: 项目中使用的maven管理器 1.导入要使用的包 2.添加Job类 配置参数 这个配置是jfinal-quartz 包中带的默认文档,即是默认加载的文档(其中还有一个q ...

  6. State(状态)

    props和state.props是在父组件中指定,而且一经指定,在被指定的组件的生命周期中则不再改变. 对于需要改变的数据,我们需要使用state.般来说,你需要在constructor中初始化st ...

  7. iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建

    iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建 一.实现效果 说明:该示例在storyboard中使用动态单元格来完成. 二.实现 1.项目文件结构 ...

  8. Spring Bean配置

    Spring 是什么 •Spring 为简化企业级应用开发而生. 使用 Spring 可以使简单的 JavaBean 实现以前只有 EJB 才能实现的功能. •Spring 是一个 IOC(DI) 和 ...

  9. [转]解决ubuntu下面putty不能连接RS232串口(USB2COM线)

    http://m.blog.csdn.net/blog/wuyanrobert_tjsd/33045255 最后还是sudo了,感觉注销后没有加入dialout组

  10. Java EE注册三部曲(一步曲)

    一步曲(html+servlet+SQL+Bean+Dao+加密(Base64)) 设计思路: 1:编写前台页面jsp:register.jsp,使得用户能够实行注册操作 2:编写servlet:re ...