【问题标题】:Haystack Not Returning Results that Solr Admin Console HighlightsHaystack 不返回 Solr 管理控制台突出显示的结果
【发布时间】:2011-08-06 05:23:13
【问题描述】:

我最近设置了 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 对象。

同样,如果我搜索“我的酷网站”,我希望返回带有“网站”的字段。

我尝试使用 solr 管理界面来检查以确保我的查询得到匹配。那里一切似乎都很好: : 问题是当我使用 haystack 默认搜索界面搜索相同的查询时:

如您所见,未找到任何结果。我尝试使用 KeywordFactory 和一堆不同的 solr 配置。如果我没记错的话,查询应该得到匹配。不过,我不确定为什么 haystack 是空的。

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

【问题讨论】:

    标签: django search solr django-haystack


    【解决方案1】:

    几个月前,我与 django-haystack 和 solr 合作过。我在对 solr 进行一些特殊查询时也遇到了问题。 实际上应该通过将下一行添加到settings.py来解决:

    HAYSTACK_DEFAULT_OPERATOR = 'OR' # actually has no effect...
    

    但这对我不起作用。

    所以,在我的情况下,它是通过子类化 SearchView 类来解决的。这是我项目中的小 sn-p:

    # 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'),
    )
    

    就是这样。

    【讨论】:

    • 感谢您的完整回答。这实现了我想要的。
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    相关资源
    最近更新 更多