3

实现类似 Google 的自动完成的方法之一是在 Solr 1.4 中结合 shingles 和 termvector 组件。

首先,我们使用 shingles 组件生成所有 n-gram 分布,然后使用 termvector 获得最接近用户术语序列的预测(基于文档频率)。

架构:

<fieldType name="shingle_text_fivegram" class="solr.TextField" positionIncrementGap="100">
    <analyzer>
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
        <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
        <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
</fieldType>

Solr 配置:

<searchcomponent name="termsComponent" class="org.apache.solr.handler.component.TermsComponent"/>
<requesthandler name="/terms" class="org.apache.solr.handler.component.SearchHandler">
    <lst name="defaults">
        <bool name="terms">true</bool>
        <str name="terms.fl">shingleContent_fivegram</str>
    </lst>
    <arr name="components">
        <str>termsComponent</str>
    </arr>
</requesthandler>

通过上述设置,我需要将停用词放在 n-gram 边缘的任何位置,并将它们保留在 n-gram 序列中。

假设从“印度和中国”序列中,我需要以下序列:

india
china
india and china

并跳过其余部分。

是否可以与其他 Solr 组件/过滤器结合使用?

UPD:这是 Lucene 4 中一种可能的解决方案(应该可以连接到 SOLR):

“难道你不能制作一个自定义停止过滤器,只删除开头(看到的第一个标记)或输入结束(之后没有看到非停用词标记)的停用词吗?它需要一些缓冲/状态保持(捕获/恢复状态)但它似乎可行?” ——迈克尔·麦坎德利斯

来自:http ://blog.mikemccandless.com/2013/08/suggeststopfilter-carefully-removes.html

4

2 回答 2

1

在 Solr 1.4 中进行多字自动完成的最佳方法是使用 EdgeNGramFilterFactory,因为您需要在用户输入时匹配他/她的输入。所以你需要匹配“i”、“in”、“ind”等来暗示印度。

于 2011-08-10T00:24:01.843 回答
1

使用带有 KeywordTokenizerFactory 的单独查询分析器,因此(使用您的示例):

        <analyzer type="index">
            <tokenizer class="solr.LowerCaseTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
            <filter class="solr.ShingleFilterFactory" maxShingleSize="5" outputUnigrams="false"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false" />
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
于 2014-10-07T13:23:25.923 回答