需要帮助来决定在solr中使用的拼写检查器的类型?

时间:2016-11-22 13:53:52

标签: solr lucene spell-checking autosuggest solrcloud

我有一个关于mysql db的城市列表,它被挂钩到用于自动完成目的的UI上。我目前正在使用solr-5.3.0。数据导入通过预定的delta导入进行。我有以下问题:

  1. 我想对此功能实施拼写检查。我尝试使用:

    1. DirectSolrSpellChecker
    2. IndexBasedSpellChecker
    3. FileBasedSpellChecker
    4. 在这3个中只有FileBasedSpellChecker能够给出 仅存在于db上的建议。例如,在搜索时 古龙水我有像

      这样的结果
          {
        "responseHeader":{
          "status":0,
          "QTime":4,
          "params":{
            "q":"searchfield:kolakata",
            "indent":"true",
            "spellcheck":"true",
            "wt":"json"}},
        "response":{"numFound":0,"start":0,"docs":[]
        },
        "spellcheck":{
      "suggestions":[
        "cologne",{
          "numFound":4,
          "startOffset":12,
          "endOffset":19,
          "suggestion":["Cologne",
            "Bologna",
            "Cogne",
            "Bastogne"]}],
      "collations":[
        "collation","searchfield:Cologne"]}}
      

      这些城市非常准确,存在于db / file中。

      但是当我使用其他2时,我得到了像

      这样的结果
        {
        "responseHeader":{
          "status":0,
          "QTime":4,
          "params":{
            "q":"searchfield:kolakata",
            "indent":"true",
            "spellcheck":"true",
            "wt":"json"}},
        "response":{"numFound":0,"start":0,"docs":[]
        },
        "spellcheck":{
      "suggestions":[
        "cologne",{
          "numFound":4,
          "startOffset":12,
          "endOffset":19,
          "suggestion":["Cologne",
            "Cologn",
            "Colognei"]}],
      "collations":[
        "collation","searchfield:Cologne"]}}
      

      我的数据库中没有这些城市。

      虽然FileBasedSpellChecker给出了满意的结果,但是我 我有点担心使用它们,因为我需要保留 每次添加/删除新城市时手动更新文件。 此外,通常不建议使用FileBasedSpellChecker 一般

    5. 我还需要搜索建议,这意味着 目前我正在访问

      中返回的文档
      "responseHeader":{"response":{"docs":[<some-format>]}} 
      

      在该城市搜索结果,但现在我想要建议者 将结果返回到相同的<some-format>而不是仅仅 字符串结果,以使其与UI正确集成。

    6. 要求的一个小改动是按升序对建议进行排序 编辑顺序/ levenshtein距离。这不是一个硬性要求 并且可以与之协商。

    7. 修改  我的solrconfig看起来像这样:

      <requestHandler name="/select" class="solr.SearchHandler">
           <lst name="defaults">
             <str name="echoParams">explicit</str>
             <int name="rows">10</int>
             <str name="df">searchfield</str>
             <str name="spellcheck">true</str>
             <str name="spellcheck.collate">true</str>
             <str name="spellcheck.dictionary">file</str>
             <str name="spellcheck.maxCollationTries">5</str>
             <str name="spellcheck.count">5</str>
           </lst>
           <arr name="last-components">
              <str>spellcheck</str>
           </arr>
      </requestHandler>
      

        <searchComponent name="spellcheck" class="solr.SpellCheckComponent">
              <str name="queryAnalyzerFieldType">text_ngram</str>
              <lst name="spellchecker">
                      <str name="name">file</str>
                      <str name="classname">solr.FileBasedSpellChecker</str>
                      <str name="sourceLocation">spellings.txt</str>
                      <str name="spellcheckIndexDir">./spellchecker</str>
              </lst>
        </searchComponent>
      

      架构如下所示:

       <field name="name" type="string" indexed="true" stored="true" multiValued="false" />
          <field name="latlng" type="location" indexed="true" stored="true" multiValued="false" />
          <field name="citycode" type="string" indexed="true" stored="true" multiValued="false" />
          <field name="country" type="string" indexed="true" stored="true" multiValued="false" />
          <field name="searchscore" type="float" indexed="true" stored="true" multiValued="false" />
          <field name="searchfield" type="text_ngram" indexed="true" stored="false" multiValued="true" omitNorms="true"  omitTermFreqAndPositions="true" />
      <defaultSearchFieldsearchfield</defaultSearchField>
              <solrQueryParser defaultOperator="OR"/>
              <copyField source="name" dest="searchfield"/>
      

0 个答案:

没有答案