基于句子而不是整个字段值构建 Solr 建议

Posted

技术标签:

【中文标题】基于句子而不是整个字段值构建 Solr 建议【英文标题】:Build Solr suggestions based on sentences instead of the entire field value 【发布时间】:2015-11-07 21:49:07 【问题描述】:

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

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

所以,如果我想要 "foo" 的建议,并且 content 字段包含如下文本:

“我真的很喜欢披萨。还有甜甜圈。让我们从另一个地方买点吧。foo bar 的地方。”

建议将是整个文本,而不仅仅是“The foo bar place”。而且,很明显,当content 有数百个字长时,这不是 usabe。

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

这是我的搜索组件:

<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"/>

然后我用一堆&lt;copyField&gt;s 把内容复制过来。

编辑 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】:

我认为您可能正在寻找的是 solr.ShingleFilterFactory,它只允许根据字数限制标记大小,而不是像 solr.NGramFilterFactory 你一直在尝试使用。 详情请参阅 SOLR wiki 页面:https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.ShingleFilterFactory

【讨论】:

谢谢。我去看看。 不幸的是,这似乎不起作用。它仍然建议使用很长的短语,而不仅仅是句子。

以上是关于基于句子而不是整个字段值构建 Solr 建议的主要内容,如果未能解决你的问题,请参考以下文章

solr 通过配置多值字段动态字段来解决文本表达式查询精确到句子的问题20171214

基于Solr,构建搜索引擎专栏· 高级篇

Solr 建议 - 使用 DocumentDictionaryFactory 进行上下文过滤返回整个字段

Apache Solr 字符串字段或文本字段?

Solr 建议最常见的结果而不返回整个短语

SQL,仅结合两个具有不同值的表(仅基于三个字段,而不是整行)