我最近设置了solr和haystack来搜索我的django模型之一。我试图修改haystack构建的默认solr模式以使用NGramTokenizerFactory
:
<fieldType name="text" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="32" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="32" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
我的数据库中有一两个单词条目,我想根据用户的查询进行匹配。例如,我可能有一个标题为“dog”的对象,另一个标题为“cat”的对象。如果用户搜索“dog cat”,那么我想返回该查询的dog和cat对象。
同样,如果我搜索“我的酷网站”,我希望返回带有“网站”的字段。
我尝试使用solr管理界面检查以确保我的查询匹配。一切似乎都没问题: : 问题是当我使用haystack默认搜索界面搜索同一个查询时:
如您所见,未找到任何结果。我尝试使用KeywordFactory和一堆不同的solr配置。如果我没弄错的话,那么的查询应匹配。我不知道为什么干草堆会空出来。
感谢您提供任何帮助/建议,了解这是否是进行此类搜索的最佳方式。
答案 0 :(得分:1)
几个月前,我曾与django-haystack
和solr合作过。我在向solr提出一些特殊查询时遇到了问题。
实际上它应该通过添加到settings.py
的下一行来解决:
HAYSTACK_DEFAULT_OPERATOR = 'OR' # actually has no effect...
但它对我不起作用。
所以,在我的情况下,它是通过继承SearchView
类来解决的。这是我项目的小片段:
# views.py:
from haystack.views import SearchView
class PeriodicalSearchView(SearchView):
def get_results(self):
"""
Fetches the results via the form.
Returns an empty list if there's no query to search with.
"""
if not (self.form.is_valid() and self.form.cleaned_data['q']):
return self.form.no_query_found()
query = self.form.cleaned_data['q']
words = iter(set(query.split()))
word = words.next()
sqs = self.form.searchqueryset.filter(text=word) # actually I have one more field here...
for word in words:
sqs = sqs.filter_or(title=word).filter_or(text=word)
if self.load_all:
sqs = sqs.load_all()
return sqs
def __call__(self, request, template_name=None):
"""
Generates the actual response to the search.
Relies on internal, overridable methods to construct the response.
"""
if template_name:
self.template = template_name
return super(PeriodicalSearchView, self).__call__(request)
和urls.py
# urls.py:
from .views import PeriodicalSearchView
urlpatterns = patterns('',
url(r'^search/$', PeriodicalSearchView(template='template_search.html'),
name='haystack_search'),
)
就是这样。