【问题标题】:Django haystack, how to match parts of words?Django haystack,如何匹配部分单词?
【发布时间】:2012-05-23 10:40:48
【问题描述】:

我在 Django 1.4 中使用 haystack 1.2.7 + whoosh 2.4.0(Python 是 2.7)

示例:搜索查询“sear”应匹配包含“search”、“sear”和“searching”(等)的项目。

我的设置:

HAYSTACK_SITECONF = 'verticalsoftware.search.search_sites'
HAYSTACK_SEARCH_ENGINE = 'whoosh'
HAYSTACK_WHOOSH_PATH = 'C:/whoosh/prodeo_index'
HAYSTACK_INCLUDE_SPELLING = True

搜索索引:

class GalleryIndex(SearchIndex):
    text = indexes.CharField(document=True, use_template=True)
    content_auto = indexes.NgramField(model_attr='title') 
    def index_queryset(self):
        """Used when the entire index for model is updated."""
        return Gallery.objects.filter(date_added__lte=datetime.datetime.now())

还尝试使用 EdgeNgramField 和/或 RealTimeSearchIndex

自定义 urlCONF:

from django.conf.urls.defaults import *
from verticalsoftware.search.views import SearchWithRequest

urlpatterns = patterns('haystack.views',
    url(r'^$', SearchWithRequest(), name='haystack_search'), 
)

自定义视图:

from haystack.views import SearchView
import operator
from haystack.query import SearchQuerySet, SQ

class SearchWithRequest(SearchView):

    __name__ = 'SearchWithRequest'

    def build_form(self, form_kwargs=None):
        if form_kwargs is None:
            form_kwargs = {}

        if self.searchqueryset is None:
            sqs = SearchQuerySet().filter(reduce(operator.__or__, [SQ(text=word.strip()) for word in self.request.GET.get("q").split(' ')]))
            form_kwargs['searchqueryset'] = sqs

        return super(SearchWithRequest, self).build_form(form_kwargs)

对于 sqs,我已经尝试了所有可以想象的方法,使用了文档和我能找到的每个相关论坛帖子中看到的过滤器和自动完成功能;将 __startswith 和 __contains 与我的 content_auto 或文本字段结合使用根本没有帮助(后者根本不匹配任何内容;而前者只匹配 1 个字符或完整的字符串)

上面粘贴的变体至少具有返回带有空格的字符串的结果的好处(每个单词仍然必须完全匹配相应的数据库条目,因此需要这篇文章)

我们将不胜感激任何帮助

【问题讨论】:

    标签: django-haystack whoosh


    【解决方案1】:

    晚了,但是建议把你的主文档字段(文本)改为EdgeNgramFieldNgramField,否则搜索到的索引无法匹配单词片段,只有完整的单词匹配才能与@ 987654323@.

    此外,在调试 haystack 时,在 django shell 中播放有时很有用:

    ./manage.py shell
    from haystack.query import SearchQuerySet
    s = SearchQuerySet()
    s.auto_query('sear')
    s.auto_query('sear').count()
    ...
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-12
      • 2013-10-28
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2011-05-22
      相关资源
      最近更新 更多