zoukankan      html  css  js  c++  java
  • solr suggest+autocomplete实现自动提示

    1.配置suggest

    可实现的输入提示,分为两种 :单词提示 、短语提示。

    单词提示使用的字段类型,分析过滤配置如下 :

    1 <fieldType class="solr.TextField" name="textSpell" positionIncrementGap="100">
    2     <analyzer>
    3         <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    4         <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
    5         <filter class="solr.LowerCaseFilterFactory"/>
    6     </analyzer>
    7 </fieldType>

    短语提示使用的字段类型,分析过滤配置如下:

    1 <fieldType class="solr.TextField" name="textSpell">
    2     <analyzer>
    3         <tokenizer class="solr.KeywordTokenizerFactory"/>
    4         <filter class="solr.LowerCaseFilterFactory"/>
    5     </analyzer>
    6 </fieldType>

    我这里用的是短语提示,把上面的配置文件,拷贝到 schema.xml 文件的 types 节点里 。

    然后在schema.xml 文件的fields节点里,新建一个索引字段,使用上面的短语提示[ textSpell ]。

    1 <field name="suggestion" type="textSpell" indexed="true" stored="true"/>

    如果我们需要对一个 "关键词"  同时查询多个列,那么我们可以使用CopyField进行列的合并,如下:

    1 <copyField source="name" dest="text_autocomplete" maxChars="300" />

    其中source 是要拷贝的字段,dest 是要合并到的字段 ,maxChars 是字数限制。

    接下来,添加 suggest 的查询接口,在 solrconfig.xml文件里,添加如下:

     1 <searchComponent name="suggest" class="solr.SpellCheckComponent">
     2      <lst name="spellchecker">
     3           <str name="name">suggest</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           <str name="field">suggestion</str>
     7      </lst>
     8 </searchComponent>
     9 <requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">
    10      <lst name="defaults">
    11           <str name="spellcheck">true</str>
    12           <str name="spellcheck.dictionary">suggest</str>
    13           <str name="spellcheck.count">10</str>
    14      </lst>
    15      <arr name="components">
    16           <str>suggest</str>
    17      </arr>
    18 </requestHandler>

    其中searchComponent是一个拼写检查的组件, 里面定义的属性信息包括:

    name   当前组件的名称,

    classname  拼写检查使用的类名,

    lookupImpl   绑定这个搜索的对象,目前有两个类可以使用JasperLookup、TSTLookup(第二个效率更高),

    field  是schema.xml里的字段名,

    requestHandler 是查询接口,在 url 里访问使用的 。

      到这里 , 我们的suggest配置已经完成了, 接下来重启 Tomcat。刚配置好是查不出任何数据的,已经创建好的索引里没有刚配置的索引,这时候需要重新生成索引文件,把新配置的索引给生成数据。我的索引是连接的mysql数据库创建的,那么我需要重新导入一下数据,访问 dataimport?command=full-import,需要访问两次,如果还是不行,则把 {solr_hom}\{multiCore}\conf 目录下的 dataimport.properties 文件删掉 ,重新访问导入数据试试看 。

      导入成功后可以访问select?q=*:* 来查询所有的索引数据,看看新配置的索引是否已经启用,如果没有新配置的索引,则重新执行导入数据创建索引 。

      重新生成索引成功以后,我们访问/suggest?spellcheck.build=true 对查询组件建立索引,然后访问/suggest?q={keyword}进行查询 ,keyword是查询的词语,如果查询不出来数据,访问/suggest?spellcheck.build=true&q={keyword}。如果一切配置正常 , 此时会查询出数据,但是仅仅是匹配查询可以了,并没有返回相近词、匹配结果数等。

    2.autocomplete配置

      拿到jquery autocomplete插件所需的所有js文件:jquery.js(1.6+)、jquery.ui.autocomplete.js、jquery.ui.core.js、jquery.ui.menu.js、jquery.ui.position.js、jquery.ui.widge.js。css文件:jquery.ui.css、jquery.ui.autocomplete.css及相应的图片文件。

      建立html文件,在head中导入所需的js、css文件,并加入以下js代码:

    ...
    <script>
    $("#tags").autocomplete({
        source:'default.php',
        dataType:'jsonp',
        300,
        multiple:true,
        matchContains:true,
        multipleSeparator:" ",
        error:function(data){
            alert("error begin");
            console.log(data);
            alert("error end");    
        },
        success:function(data){
            var autocompleteData = data.spellcheck.suggestions[1].suggestion+"";
            var parsed = options.parse && options.parse(autocompleteData) || parse(autocompleteData);
            cache.add(term,parsed);
            success(term,parsed); 
        }
    });
    </script>
    ...

    其中:source代表自动提示的数据来源,我这儿使用的php。php负责接收用户输入,然后请求solr/suggest获取数据并加工后返回给autocomplete。

  • 相关阅读:
    高并发量网站解决方案
    多服务器之间Session共享
    Mysql性能优化
    PHP memcache的使用教程
    select * 为什么不好? limit 1 为什么好? --mysql SQL语句优化
    八大排序对比
    /var/spool/postfix/maildrop 出现大量文件原因和解决办法
    sql根据某一个字段重复只取第一条数据
    postgreSQL 自增需要使用序列
    MySQL锁定状态查看相关命令
  • 原文地址:https://www.cnblogs.com/fanelephant/p/3072445.html
Copyright © 2011-2022 走看看