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