我使用Solr的6.4草垛2.6.1,pySolr 3.6:Revelants查詢建議用於自動完成使用Solr
我正在尋找類似的建議自動完成一個谷歌。實際使用EdgeNGram的作品不錯,但它返回我的文檔僅標題究竟是不是我想要的:
例如:
typing: 'new y'
return:
New york, fabulous city that never sleep
A trip to new york by night
...
這給用戶只有選擇建議列表來選擇特定的文件和搜索將只返回基於建議標題的搜索文檔。
我想要的是像revelants字的建議:
typing: 'new y'
return:
new york
new york by night
new york city
trip to new york
有暗示由返回結果的用戶使用索引查詢,然後將這些查詢作爲建議的文章: https://lucidworks.com/2009/09/08/auto-suggest-from-popular-queries-using-edgengrams/
這意味着解析solr日誌或使用數據庫中一堆保存的用戶查詢中的數據導入(DIH)。
其實這篇文章是很老的(2009年),並自那時以來的Solr已經給我們帶來的建議者(https://cwiki.apache.org/confluence/display/solr/Suggester)
無論如何,我不知道是否確實有關於如何使用建議者與revelant查詢,而不是一個很好的教程回到我的文檔標題,而不需要保存用戶的查詢在DB,通過預定程序導入,重新索引等
我search_indexes.py
class ArticleIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
created = indexes.DateTimeField(model_attr='created')
rating = indexes.IntegerField(model_attr='rating')
title = indexes.CharField(model_attr='title', boost=1.125)
term = indexes.EdgeNgramField(model_attr='title')
def get_model(self):
return Article
我article_text.txt
{{ object.title }}
{{ object.created }}
{{ object.rating }}
我的schema.xml
<field name="term" type="text_general" indexed="true" stored="true" />
<field name="weight" type="float" indexed="true" stored="true" />
<fieldType name="edge_ngram" class="solr.TextField" positionIncrementGap="1">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory" />
<filter class="solr.LowerCaseFilterFactory" />
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front" />
</analyzer>
</fieldType>
<fieldType name="suggestType" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^a-zA-Z0-9]" replacement=" " />
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
我solrconfig.xml中
<requestHandler name="/suggest" class="solr.SearchHandler" startup="lazy" >
<lst name="defaults">
<str name="suggest">true</str>
<str name="suggest.dictionary">infixSuggester</str>
<str name="suggest.onlyMorePopular">true</str>
<str name="suggest.count">10</str>
<str name="suggest.collate">true</str>
</lst>
<arr name="components">
<str>suggest</str>
</arr>
</requestHandler>
<searchComponent name="suggest" class="solr.SuggestComponent">
<lst name="suggester">
<str name="name">infixSuggester</str>
<str name="lookupImpl">AnalyzingInfixLookupFactory</str>
<str name="indexPath">infix_suggestions</str>
<str name="highlight">false</str>
<str name="dictionaryImpl">DocumentDictionaryFactory</str>
<str name="field">term</str>
<str name="weightField">weight</str>
<str name="suggestAnalyzerFieldType">suggestType</str>
<str name="buildOnStartup">false</str>
<str name="buildOnCommit">false</str>
</lst>
</searchComponent>
我用pysolr查詢的Solr作爲草堆沒有實現卻把建議方法:
from pysolr import Solr
solr = Solr(settings.HAYSTACK_CONNECTIONS['default']['URL'], search_handler='/suggest', use_qt_param=False)
raw_results = solr.search('', **{'suggest.q': query_string})
這隻會返回單個單詞,而不是您最初想要的短語。您也可以使用帶有帶狀皰疹的FreeTextLookupFactory,如我的答案的第二次編輯中所使用的那樣,這將返回短語而不是單詞。 –
我嘗試了你的改變,仍然返回標題。 – kollo
嗯。您是否將term_suggest的phrase_suggest字段類型(並重新編制了索引)? –