solr入门之搜索建议配置和代码Demo

检索建议

       检索建议目前是各大搜索的标配应用,主要作用是避免用户输入错误的搜索词,同时将用户引导到相应的关键词搜索上。Solr内置了检索建议功能,它在 Solr里叫做Suggest模块.该模块可选择基于提示词文本做检索建议,还支持通过针对索引的某个字段建立索引词库做检索建议。在诸多文档中都推荐使 用基于索引来做检索建议,因此我们目前的实现也是采取该方案。

       现在我们开始配置Suggest模块,首先在solrconfig.xml文件中配置Suggest依赖的SpellChecker模块,然后再配置Suggest模块,所以这两个都需要配置。

<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">这里写为你的collection要有建议的字段一般是复合字段</str>

        <float name="threshold">0.0001</float>

        <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="solr.SearchHandler" startup="lazy">

    <lst name="defaults">

        <str name="spellcheck">true</str>

        <str name="spellcheck.dictionary">suggest</str>

        <str name="spellcheck.onlyMorePopular">true</str>

        <str name="spellcheck.extendedResults">false</str>

        <str name="spellcheck.count">10</str>

        <str name="spellcheck.collate">true</str>

    </lst>

    <arr name="components">

        <str>suggest</str>

    </arr>

</requestHandler>

配置完成之后,我们进行一下测试,重启Solr后,访问如下链接

http://localhost:8983/solr/ collection1/suggest?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BD

<?xml version="1.0" encoding="UTF-8"?>
<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">4</int>
</lst>
<lst name="spellcheck">
<lst name="suggestions">
<lst name="中国">
<int name="numFound">4</int>
<int name="startOffset">0</int>
<int name="endOffset">2</int>
<arr name="suggestion">
<str>中国队</str>
<str>中国证监会</str>
<str>中国足协</str>
<str>中国银行</str>
</arr>
</lst>
</lst>
</lst>
</response>

使用SolrJ时也同样加入参数就可以

 

     

 public static void getSuggest(String suggest) throws SolrServerException, Exception{
        
        HttpSolrClient solrClient = new HttpSolrClient("http://localhost:8983/solr/group");
        
        SolrQuery solrQuery = new SolrQuery();
        solrQuery.set("qt", "/suggest");
        
        solrQuery.set("q", "衣");   
        
        solrQuery.set("spellcheck.count", "10");
        
        QueryResponse response = solrClient.query(solrQuery);
        
        SpellCheckResponse checkResponse = response.getSpellCheckResponse();
        ArrayList<String> spellwords = new ArrayList<String>();
        if(checkResponse!=null){
            List<Suggestion> suggestions = checkResponse.getSuggestions();
            
            for (Suggestion s : suggestions) {
                
                List<String> list = s.getAlternatives();
                for (String spellword : list) {
                    System.out.println(spellword);
                    spellwords.add(spellword);
                }
            }
        }
        System.out.println(spellwords);
        
        
        String firstSuggestion = checkResponse.getFirstSuggestion("衣");
        System.out.println(firstSuggestion);
     
    }


通过threshold参数来限制一些不常用的词不出现在智能提示列表中,当这个值设置过大时,可能导致结果太少,需要引起注意。目前主要存在的问题是使 用freq排序算法,返回的结果完全基于索引中字符的出现次数,没有兼顾用户搜索词语的频率,因此无法将一些热门词排在更靠前的位置。这块可定制 SuggestWordScoreComparator来实现,目前还没有着手做这件事情。


关于搜索建议的 一点总结:

搜索建议中配置的字段就为搜索建议的文档域这个字段要配置好,因为只能从这一个字段中获取建议---设置复合字段


搜索建议的分词器也是个问题,建议的结果和选用的 分词方法息息相关 这个也是 注意点


还有一个如果选中的建议字段是没有创建索引的话 那么该字段的建议也是 无效的


附加拼写检查功能

拼写检查(网上资料未实践)

       首先配置 solrconfig.xml,文件可能已经有这两个元素(如果没有添加即可),需要根据我们自己的系统环境做些适当的修改。

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
     <str name="queryAnalyzerFieldType">text_spell</str> 
     <lst name="spellchecker"> 
       <str name="name">direct</str> 
       <str name="field">spell</str> 
       <str name="classname">solr.DirectSolrSpellChecker</str> 
       <str name="distanceMeasure">internal</str> 
       <float name="accuracy">0.5</float> 
       <int name="maxEdits">2</int> 
       <int name="minPrefix">1</int> 
       <int name="maxInspections">5</int> 
       <int name="minQueryLength">2</int> 
       <float name="maxQueryFrequency">0.01</float> 
</lst> 
  </searchComponent> 
  <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> 
     <lst name="defaults"> 
         <str name="spellcheck.dictionary">direct</str> 
          <str name="spellcheck">on</str>  
          <str name="spellcheck.collate">true</str> 
         <str name="spellcheck.collateExtendedResults">true</str>   
     </lst> 
     <arr name="last-components"> 
       <str>spellcheck</str> 
     </arr> 
   </requestHandler>

配置完成之后,我们进行一下测试,重启Solr后,访问如下链接

http://localhost:8983/solr/ collection1/spell?wt=xml&indent=true&spellcheck=true&spellcheck.q=%E4%B8%AD%E5%9B%BD

<?xml version="1.0" encoding="UTF-8"?>  
  <response>  
    <lst name="responseHeader">  
      <int name="status">0</int>  
      <int name="QTime">0</int>  
    </lst>  
    <result name="response" numFound="0" start="0"/>  
    <lst name="spellcheck">  
      <lst name="suggestions">  
        <lst name="beijink">  
          <int name="numFound">1</int>  
          <int name="startOffset">0</int>  
          <int name="endOffset">3</int>  
          <arr name="suggestion">  
            <str>beijing</str>  
          </arr>  
        </lst>  
      </lst>  
    </lst>  
  </response>

使用SolrJ时也同样加入参数就可以

SolrQuery query = new SolrQuery();

query.set("q","*.*");

query.set("qt", "/spell");

QueryResponse rsp =server.query(query)

//…上面取结果的代码

SpellCheckResponse spellCheckResponse = rsp.getSpellCheckResponse();

if (spellCheckResponse != null) {

  String collation = spellCheckResponse.getCollatedResult();

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值