我想使用Solr实现类似Google的自动建议/完成。我有两个与此相关的问题:
我们是否可能只索引但不存储运行自动完成的字段或者假设要运行的术语组件!
我们可以使用多个字段来获取数据以填充自动建议吗?如果是,则可以将这些字段仅用作索引而不是存储!
如果有人申请并尝试了这样的实施并且可以帮助我,我会非常满意。
由于 赛义夫
答案 0 :(得分:3)
在Solr 4.0中有一个名为Suggester的新组件。它使用拼写检查组件根据您现有的索引构建建议。
我仍然在调整我的字段类型的Probeter组件,但这是我到目前为止看起来工作得很好。
<fieldtype name="textSuggest" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.PatternReplaceFilterFactory"
pattern="(^[^A-Za-z0-9]*|[^A-Za-z0-9]*$)" replacement="" replace="all" />
<filter class="solr.LengthFilterFactory" min="2" max="60" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
<filter class="solr.ShingleFilterFactory" maxShingleSize="3" outputUnigrams="true" outputUnigramIfNoNgram="true" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
<filter class="solr.ShingleFilterFactory" maxShingleSize="99" outputUnigrams="false" outputUnigramIfNoNgram="true" />
</analyzer>
</fieldtype>
答案 1 :(得分:1)
您正在查找可以查询的Solr TermsComponent,以返回索引字段中存在的字词及其频率。具体来说,您需要terms.prefix
参数,该参数将返回以您指定的前缀开头的所有术语。
答案 2 :(得分:0)
在SOLR中进行自动填充时,您必须将要搜索的ngram字段定义为已存储,以便返回值。
另外我认为在SOLR中你无法从多个字段中获取数据并从中提取单个ngram。更简单的方法是创建一个字段并将要使用的所有其他字段中的数据复制到该字段中,然后对其应用ngram标记。
答案 3 :(得分:0)
solr允许将copyfield用作自动完成的索引。这是我在solr auto-suggest / auto-complete,<copyField source="name" dest="text"/>
中的工作示例。显然,solr只会索引您将在自动完成中使用的字段。
另一方面,除非存储字段,否则无法检索字段,这里我的意思是原始字段而不是复制字段。我建议复制可搜索字段ex:name,然后根据自己的查询检索所有其他字段。您需要创建搜索处理程序和请求处理程序的自定义。
稍后我会用完整的解决方案编辑它。
您可以使用本文了解有关该主题的更多信息,然后扩展您的解决方案。 http://solr.pl/en/2010/10/18/solr-and-autocomplete-part-1/