【发布时间】:2017-07-28 22:35:42
【问题描述】:
我将 Solr 6.4 与 Haystack 2.6.1、pySolr 3.6 一起使用:
我正在寻找类似 google 的建议自动完成功能。实际上使用 EdgeNGram 效果很好,但它只返回我不想要的文件标题:
示例:
typing: 'new y'
return:
New york, fabulous city that never sleep
A trip to new york by night
...
这使用户只能选择在建议列表中特别是选择一个文档,并且搜索将仅返回基于建议标题进行搜索的文档。
我想要的是一些相关词的建议,例如:
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 就为我们带来了 Suggester (https://cwiki.apache.org/confluence/display/solr/Suggester)
无论如何,我想知道是否真的有一个很好的教程,介绍如何将 Suggester 与相关查询一起使用,而不是返回我的文档标题,而无需将用户的查询保存在数据库中,通过预定流程导入它们、重新索引等。
我的 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
我的文章_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,因为 Haystack 还没有实现建议方法:
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})
【问题讨论】:
标签: django solr autocomplete search-suggestion