从Solr检索具有频率的Ngram列表

时间:2014-02-17 12:25:54

标签: solr n-gram

我意识到可以使用以下API从solr获得最高术语:
    本地主机:8983 / solr的/管理/卢克FL =文本&安培; numTerms = 5000&安培;重量= JSON
但这只是列出了顶级的unigrams(例如“David”),而不是bigrams(例如“David Beckham”),trigrams等
有没有办法可以从Solr获取,这是一个顶级双字母组,三元组等的列表?

2 个答案:

答案 0 :(得分:2)

可以使用Ngram过滤器声明字段类型,如:

<fieldType 
   name="myNGram" 
   stored="false" 
   class="solr.StrField"> 
 <analyzer type="index"> 
   <tokenizer class="solr.StandardTokenizerFactory"/>
   <filter class="solr.LowerCaseFilterFactory"/> 
   <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="5"/> 
 </analyzer> 
</fieldType>

然后声明类型为myNGram

的副本字段
<field name="ngrams" type="myNGram" indexed="true" stored="false" required="false" />

<copyField source="doc_text" dest="ngrams"/>

假设文档文本位于doc_test字段。

localhost:8983/solr/admin/luke?fl=ngrams&numTerms=5000&wt=json

这将混合将为您提供长度为2到5的顶级ngram。如果您只想要双字母组,则可以将NGramFilterFactory的maxGramSize参数限制为2。

答案 1 :(得分:1)

Ion有正确的想法,但你应该使用shingle filter。例如:

<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="5" outputUnigrams="true"
                outputUnigramsIfNoShingles="false" tokenSeparator=" "/>
    </analyzer>
</fieldType>

<field name="ngrams" type="ngram" indexed="true" stored="false" required="false" multiValued="true" />

然后对此字段使用terms component

http://localhost:8983/solr/sample/terms?terms.fl=ngrams