比较详细的介绍了拼写检查的功能,本篇笔者就来说一下检索建议的功能,可能好多才学的solr的人,都容易把二者搞混,误以为他们是同一个东西,其实不然,他们的侧重点,还是不同的,拼写检查就是用来检查用户输入的检索内容是否存在,如果不存在则,给它提示出相近,或相似的内容,而检索建议则是用户输入某个检索条件后,会立刻友好的给出一系列提示内容,并推荐首个出现的相似的词,作为推荐词。如果这个条件想关的东西一个都没有,则不会提示,所以某种意义上来说,可以在用户输入检索条件时使用suggest,而在点击完搜索时,使用拼写检查,二者结合给可以用户带来比较好的用户体验!
检索建议(suggest)是依附于拼写检查组件实现的功能,所以呢SpellCheck这个组件很重要,拼写检查可以作为一个功能,单独使用,但是suggest功能就不可以,必须的在拼写检查组件存在的时候可以用,否则再启动tomcat时,会报一个未知的SpellCheck组件异常。 下面开始进入正题,suggest的配置相对简单,主要也是由两种形式,第一种只能用主索引库里面存在的建议词,作为提示。第二种使用自定义的建议词库作为建议词,自定义的建议词文本,放在跟solrconfig.xml同一级目录下即可- F:\tomcat\webapps\solr\solr_home\collections\collection1\conf\suggest.txt
F:\tomcat\webapps\solr\solr_home\collections\collection1\conf\suggest.txt下面给出suggest在solrconfig.xml里配置的代码
- <searchComponent name="suggest" class="solr.SpellCheckComponent">
- <str name="queryAnalyzerFieldType">string</str>
- <lst name="spellchecker">
- <str name="name">suggest</str>
- <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
- <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
- <str name="field">my_word</str>
- <float name="threshold">0.0001</float>
- <!-- 使用自定义suggest词库词可以将如下两行的注释取消
- <str name="sourceLocation">suggest.txt</str>
- <str name="spellcheckIndexDir">spellchecker</str>
- -->
- <str name="comparatorClass">freq</str>
- <str name="buildOnOptimize">true</str>
- <str name="buildOnCommit">true</str>
- </lst>
- </searchComponent>
- <requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
- <lst name="defaults">
- <str name="spellcheck">true</str>
- <str name="spellcheck.dictionary">suggest</str>
- <str name="spellcheck.count">10</str>
- <str name="spellcheck.onlyMorePopular">true</str>
- <str name="spellcheck.extendedResults">false</str>
- <str name="spellcheck.collate">true</str>
- <!--<str name="spellcheck.build">true</str> -->
- </lst>
- <arr name="components">
- <str>suggest</str>
- </arr>
- </requestHandler>
至此,我们就可以启动solr服务,在UI页面使用/suggest请求,进行测试,下面给出solrj的代码string suggest org.apache.solr.spelling.suggest.Suggester org.apache.solr.spelling.suggest.tst.TSTLookup my_word 0.0001 freq true true true suggest 10 true false true suggest
- public List<String> suggest(String word)throws Exception{
- List<String> wordList=new ArrayList<String>();
- SolrQuery query = new SolrQuery();
- query.set("q", "my_word:"+word);//查询的词
- query.set("qt", "/suggest");//请求到suggest中
- query.set("spellcheck.count", "10");//返回数量
- QueryResponse rsp = server.query(query);
- // System.out.println("直接命中:"+rsp.getResults().size());
- //…上面取结果的代码
- SpellCheckResponse re=rsp.getSpellCheckResponse();//获取拼写检查的结果集
- if (re != null) {
- for(Suggestion s:re.getSuggestions()){
- List<String> list=s.getAlternatives();//获取所有 的检索词
- for(String spellWord:list){
- System.out.println(spellWord);
- wordList.add(spellWord);
- }
- return wordList;//建议词汇
- }
- // List<Collation> list=re.getCollatedResults();//
- String t=re.getFirstSuggestion(word);//获取第一个推荐词
- System.out.println("推荐词:"+t);
- // for(Collation c:list){
- //
- // System.out.println("推荐词:"+c.getCollationQueryString());
- // }
- }
- return null;
- }
public List最后,我们就在 WEB项目中,使用ajax+suggest+keyup事件,就可以实现类似百度输入框的功能了。suggest(String word)throws Exception{ List wordList=new ArrayList (); SolrQuery query = new SolrQuery(); query.set("q", "my_word:"+word);//查询的词 query.set("qt", "/suggest");//请求到suggest中 query.set("spellcheck.count", "10");//返回数量 QueryResponse rsp = server.query(query); // System.out.println("直接命中:"+rsp.getResults().size()); //…上面取结果的代码 SpellCheckResponse re=rsp.getSpellCheckResponse();//获取拼写检查的结果集 if (re != null) { for(Suggestion s:re.getSuggestions()){ List list=s.getAlternatives();//获取所有 的检索词 for(String spellWord:list){ System.out.println(spellWord); wordList.add(spellWord); } return wordList;//建议词汇 } // List list=re.getCollatedResults();// String t=re.getFirstSuggestion(word);//获取第一个推荐词 System.out.println("推荐词:"+t);// for(Collation c:list){// // System.out.println("推荐词:"+c.getCollationQueryString());// } } return null; }