根据句子而不是整个字段值构建Solr建议

时间:2015-08-14 15:20:15

标签: indexing solr lucene search-engine solr5

我有一个带有建议组件的S​​olr实例。它使用AnalyzingInfixLookupFactory实现工作正常。

但是,我想将建议扩展到content字段,该字段可能包含大量文本。建议者可以找到建议,但它会返回整个字段值,而不仅仅是句子或句子的一部分。

所以,如果我想要“foo”的建议,content字段包含如下文字:

“我真的很喜欢比萨饼。还有甜甜圈。让我们从那个地方买点。这个棒吧。”

建议是整篇文字,而不只是“foo bar place”。而且,显然,当content长达数百个单词时,这不是可以使用的。

有没有办法限制建议的返回字数?

这是我的搜索组件:

<searchComponent name="suggest" class="solr.SuggestComponent">
  <lst name="suggester">
    <str name="name">autocomplete</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="indexPath">suggestions</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="field">suggest</str>
    <str name="suggestAnalyzerFieldType">text_suggest</str>
    <str name="buildOnStartup">false</str>
    <bool name="highlight">false</bool>
    <str name="payloadField">label</str>
  </lst>
</searchComponent>

这是请求处理程序:

<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy">
  <lst name="defaults">
    <str name="suggest">true</str>
    <str name="suggest.dictionary">autocomplete</str>
    <str name="suggest.count">10</str>
  </lst>
  <arr name="components">
    <str>suggest</str>
  </arr>
</requestHandler>

最后,这是从中得出建议的字段:

<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<field name="suggest" type="text_suggest" indexed="true" multiValued="true" stored="true"/>

然后我使用一堆<copyField>来复制内容。

编辑2015-08-28

content字段定义如下:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <charFilter class="solr.MappingCharFilterFactory" mapping="txt/mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="txt/stopwords.txt" />
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0" splitOnNumerics="0" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="25"/>
  </analyzer>
  <analyzer type="query">
    <charFilter class="solr.MappingCharFilterFactory" mapping="txt/mapping-ISOLatin1Accent.txt"/>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

<field name="content" type="text" indexed="true" stored="true" termVectors="true"/>

编辑2016-09-28

此问题可能与此相关:Is Solr SuggestComponent able to return shingles instead of whole field values?

1 个答案:

答案 0 :(得分:1)

我认为您可能正在寻找的是 solr.ShingleFilterFactory ,它只允许基于单词count来限制令牌大小,而不是像 solr.NGramFilterFactory <中的文本长度一样/ strong>您一直在尝试使用。
有关详细信息,请参阅SOLR维基页面:
https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory