Solr SuggestComponent能够返回带状疱疹而不是整个字段值吗?

时间:2015-04-08 21:29:38

标签: solr autocomplete autosuggest

我使用solr 5.0.0并希望创建一个自动完成功能,从我的文档的word-gram(或带状疱疹)生成建议。 问题是,作为一个建议查询的回报,我只能得到完整的"术语"搜索字段可能非常长。

当前问题:

输入:"所以" 建议: " ......极长的文字如此 n长篇文章继续......"

" ......下一个长文所以下一个文字继续......"

目标:

输入:"所以"

带状疱疹的建议:

"的所以 N'#34;

"的所以 LAR"

" 所以 lar test"

<searchComponent name="suggest" class="solr.SuggestComponent" 
               enable="${solr.suggester.enabled:true}"     >
<lst name="suggester">
  <str name="name">mySuggester</str>
  <str name="lookupImpl">AnalyzingInfixLookupFactory</str>      
  <str name="dictionaryImpl">DocumentDictionaryFactory</str>
  <str name="field">title_and_description_suggest</str>
  <str name="weightField">price</str>
  <str name="suggestAnalyzerFieldType">autocomplete</str>
  <str name="queryAnalyzerFieldType">autocomplete</str>
 <str name="buildOnCommit">true</str>
</lst>

schema.xml中:

<fieldType name="autocomplete" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="lang/stopwords_de.txt" format="snowball"/>
      <filter class="solr.ShingleFilterFactory" maxShingleSize="2" outputUnigrams="true" outputUnigramsIfNoShingles="true"/>
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

我想将最多3个单词作为自动完成术语返回。这是可能的SuggestComponent或你会怎么做?无论我尝试什么,我总能收到匹配文档的完整字段值。

这是预期的行为还是我做错了什么?

非常感谢提前

1 个答案:

答案 0 :(得分:6)

在schema.xml中定义fieldType,如下所示:

 <fieldType name="text_autocomplete" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="5"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>

在schema.xml中定义您的字段如下:

<field name="example_field" type="text_autocomplete" indexed="true" stored="true"/>

按如下方式编写您的查询:

query?q=*&
rows=0&
facet=true&
facet.field=example_field&
facet.limit=-1&
wt=json&
indent=true&
facet.prefix=so

在facet.prefix字段中,指定要搜索的要为其提出建议的术语(在此示例中为“so”)。如果建议中少于5个单词,请相应地减少fieldType定义中的maxShingleSize。默认情况下,您将按照其出现频率的降序获得结果。