如何在整个短语上使用Solr自动完成 - solr

时间:2015-09-17 03:13:54

标签: xml solr

我正在创建像google这样的建议。现在,当我写“do”时,solr返回“dog”,“doll”,它在schema字段上只返回一个单词。 我想要的是如果它像“小狗等等”,“狗店”等那样返回整个领域,那将是不错的。 这是我的schema.xml

<field name = "companyDisplayName" type = "text_auto" multiValued="false" indexed = "true" stored = "false" />

和我的架构字段类型配置:

<fieldType name="text_auto" class="solr.TextField" positionIncrementGap="100" ><analyzer type="index">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" maxGramSize="30" minGramSize="1"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

这是我的solrconfig.xml

<searchComponent class="solr.SpellCheckComponent" name="suggest">
   <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.fst.AnalyzingInfixLookupFactory</str>
      <str name="buildOnCommit">true</str>
      <str name="suggestAnalyzerFieldType">text_auto</str>
      <str name="field">companyDisplayName</str>
   </lst>
</searchComponent>

<requestHandler class="org.apache.solr.handler.component.SearchHandler" name="/suggest">
<lst name="defaults">
    <str name="spellcheck">true</str>
    <str name="spellcheck.dictionary">suggest</str>
    <str name="spellcheck.onlyMorePopular">true</str>
    <str name="spellcheck.count">5</str>
    <str name="spellcheck.collate">false</str>
<str name="echoParams">explicit</str>
<str name="defType">edismax</str>
<str name="rows">10</str>
<str name="fl">companyDisplayName</str>
<str name="qf">companyDisplayName^30</str>
<str name="pf">companyDisplayName^50.0</str>
<str name="group">true</str>
<str name="group.field">companyDisplayName</str>
<str name="sort">score desc</str>
<str name="group.sort">score desc</str>
</lst>
<arr name="components">
    <str>suggest</str>
</arr>

和我的查询:

http://localhost:8983/solr/vw_search_company_with_buildings/suggest?spellcheck.q=hunn

1 个答案:

答案 0 :(得分:0)

您的建议者需要进行多项更改才能开始工作。

  

对于您要在建议中使用的字段,请使用 stored = true 。我建议您使用copyField标记在其他字段中复制字段。您无需索引复制的字段。您可以替换text_general中的schema.xml定义。它与默认版本相同,但版本更简单。

<field name = "suggest_field" type = "text_general" multiValued="false" indexed = "false" stored = "true" />

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>
  

现在对建议者searchComponentrequestHandler使用以下配置。此配置使用solr.SuggestComponent而不是solr.SpellCheckComponent。对于AnalyzingInfixLookupFactory,默认突出显示为true,此处为false。我添加了<str name="dictionaryImpl">DocumentDictionaryFactory</str>来获取建议者中的完整属性值。

<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
    <str name="name">suggest</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">suggest_field</str>
    <str name="suggestAnalyzerFieldType">text_general</str>
    <str name="buildOnCommit">true</str>
    <str name="highlight">false</str>
</lst>
</searchComponent>


<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
<lst name="defaults">
    <str name="suggest">true</str>
    <str name="suggest.dictionary">suggest</str>
    <str name="suggest.count">10</str>
    <str name="suggest.onlyMorePopular">true</str>
    <str name="suggest.count">5</str>
    <str name="suggest.collate">false</str>
    <str name="echoParams">explicit</str>
    <str name="defType">edismax</str>
    <str name="rows">10</str>
    <str name="fl">suggest_field</str>
    <str name="qf">suggest_field^30</str>
    <str name="pf">suggest_field^50.0</str>
    <str name="group">true</str>
    <str name="group.field">suggest_field</str>
    <str name="sort">score desc</str>
    <str name="group.sort">score desc</str>
</lst>
<arr name="components">
    <str>suggest</str>
</arr>
</requestHandler>
  

使用以下命令发出建议请求。它在url中包含suggest.build=true,这意味着每次发出请求时它都会构建字典。您可以将其删除以用于生产目的。

http://localhost:8983/solr/vw_search_company_with_buildings/suggest?suggest.build=true&suggest.q=do

PS: AnalyzingInfixLookupFactory存在问题,它会在您第二次重新加载时锁定建议词典目录。您可以使用indexPath来解决问题。

这是reference link