【问题标题】:Is Solr SuggestComponent able to return shingles instead of whole field values?Solr SuggestComponent 是否能够返回带状疱疹而不是整个字段值?
【发布时间】:2015-06-14 01:31:33
【问题描述】:

我使用 solr 5.0.0 并希望创建一个自动完成功能,以根据我的文档的 word-gram(或 shingles)生成建议。 问题是,作为建议查询的回报,我只能得到搜索字段的完整“条款”,可能会非常长。

当前问题:

输入:“所以” 建议: “……超长文本所以n长文本继续……”

"......下一个长文本solar next text continue......"

目标:

输入:“所以”

关于带状疱疹的建议:

所以n”

所以拉尔”

所以拉尔测试”

<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 是否可以做到这一点,或者您将如何做到这一点?无论我尝试什么,我总是会收到匹配文档的完整字段值。

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

提前非常感谢

【问题讨论】:

    标签: solr autocomplete autosuggest


    【解决方案1】:

    在 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。默认情况下,您将按出现频率的降序获得结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-13
      • 2019-01-04
      • 2018-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多