干草堆没有返回结果Solr管理控制台突出显示

时间:2011-04-15 10:15:05

标签: django search solr django-haystack

我最近设置了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管理界面检查以确保我的查询匹配。一切似乎都没问题: enter image description here: 问题是当我使用haystack默认搜索界面搜索同一个查询时: enter image description here

如您所见,未找到任何结果。我尝试使用KeywordFactory和一堆不同的solr配置。如果我没弄错的话,那么的查询应匹配。我不知道为什么干草堆会空出来。

感谢您提供任何帮助/建议,了解这是否是进行此类搜索的最佳方式。

1 个答案:

答案 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'),
)

就是这样。