0

我一直在尝试让 xapian 工作 django haystack 用于我正在从事的项目,该项目需要一些搜索功能,但遇到了一些障碍!基本上我按照说明安装了所有东西,所以:

为 xapian-core 和 xapian 绑定运行 make install 运行 pip install haystack 和 pip install xapian-haystack 并正确安装所有内容

当我使用 django cms 应用程序时,我只是复制了他们的示例以对搜索功能进行测试并遇到此错误

InvalidIndexError at /search/
Unable to open index at /home/mike/sites/xapian_search

我已经为 HAYSTACK_XAPIAN_PATH 设置尝试了几种不同的路径,并且还遇到了另一个错误

OSError at /
(13, 'Permission denied')

文件夹 xapain_search 已获得完整权限(chmod 777),并且还有一个具有完整权限的 xapian_index.php 文件。我不确定我在这里缺少什么,但我很想尝试让这个工作!

我的干草堆设置看起来像

HAYSTACK_SITECONF = 'lactoseintolerant.lactose_search'
HAYSTACK_SEARCH_ENGINE = 'xapian'
HAYSTACK_XAPIAN_PATH = '/home/mike/sites/xapian_search'
HAYSTACK_SEARCH_RESULTS_PER_PAGE = 50

任何建议将不胜感激!!

编辑

嘿,我再次认为这个错误与没有索引的事实有关(对吗?)我已经运行了命令 update_index rebuild_index clear_index 所有这些似乎都没有做任何事情,没有输出错误,但索引仍然没有出现运行命令时构建

我有一个名为 lactose_search 的应用程序,我的 HAYSTACK_SITECONF 指向这样的应用程序文件夹中的 projectname.lactose_search 我有一个名为 search_indexs.py 的文件。现在我只需 c+p 来自 django cms 站点的示例,因为它是我要搜索的 cms_app 内容,这个文件看起来像

from django.conf import settings
from django.utils.translation import string_concat, ugettext_lazy

from haystack import indexes, site

from cms.models.managers import PageManager
from cms.models.pagemodel import Page

def page_index_factory(lang, lang_name):
if isinstance(lang_name, basestring):
    lang_name = ugettext_lazy(lang_name)

def get_absolute_url(self):
    return '/%s%s' % (lang, Page.get_absolute_url(self))

class Meta:
    proxy = True
    app_label = 'cms'
    verbose_name = string_concat(Page._meta.verbose_name, ' (', lang_name, ')')
    verbose_name_plural = string_concat(Page._meta.verbose_name_plural, ' (', lang_name, ')')
    
attrs = {'__module__': Page.__module__, 
         'Meta': Meta,
         'objects': PageManager(),
         'get_absolute_url': get_absolute_url}

_PageProxy = type("Page%s" % lang.title() , (Page,), attrs)

_PageProxy._meta.parent_attr = 'parent'
_PageProxy._meta.left_attr = 'lft'
_PageProxy._meta.right_attr = 'rght'
_PageProxy._meta.tree_id_attr = 'tree_id'

class _PageIndex(indexes.SearchIndex):
    language = lang
    
    text = indexes.CharField(document=True, use_template=False)
    pub_date = indexes.DateTimeField(model_attr='publication_date')
    login_required = indexes.BooleanField(model_attr='login_required')
    url = indexes.CharField(stored=True, indexed=False, model_attr='get_absolute_url')
    title = indexes.CharField(stored=True, indexed=False, model_attr='get_title')
    
    def prepare(self, obj):
        self.prepared_data = super(_PageIndex, self).prepare(obj)
        plugins = obj.cmsplugin_set.filter(language=lang)
        text = ''
        for plugin in plugins:
            instance, _ = plugin.get_plugin_instance()
            if hasattr(instance, 'search_fields'):
                text += ''.join(getattr(instance, field) for field in instance.search_fields)
        self.prepared_data['text'] = text
        return self.prepared_data
    
    def get_queryset(self):
        return _PageProxy.objects.published().filter(title_set__language=lang, publisher_is_draft=False).distinct()

return _PageProxy, _PageIndex

for lang_tuple in settings.LANGUAGES:
   lang, lang_name = lang_tuple
    site.register(*page_index_factory(lang, lang_name))

可以在这里找到http://docs.django-cms.org/en/2.1.3/extending_cms/searchdocs.html

希望这些额外的信息可以使回答这个问题更容易!

4

3 回答 3

2

您更有可能没有使用以下命令构建索引

python manage.py update_index

同样的事情发生在我身上,只需要运行上面的命令。

于 2012-09-18T11:32:25.563 回答
1

这是一个我还没有遇到过的相当奇怪的问题(这里还没有人报告过:https ://github.com/notanumber/xapian-haystack/issues )

旧版本的 Xapian-Haystack 需要写权限(才能创建索引)并在启动时进行检查以验证是否存在这种情况,但已将其删除。

只要该过程可以读取该HAYSTACK_XAPIAN_PATH文件夹,您就不会收到任何Permission Denied错误。

你能确认你使用的是什么版本的后端吗?如果可能的话,我还建议尝试用 Whoosh 换掉后端,以检查是否没有发生任何事情。

于 2011-06-18T16:02:20.043 回答
0

我弄清楚了我的问题是什么,当我将软件包安装到我的环境时,我运行了 sudo pip install 而不是简单地使用 pip。我无法解释为什么这会影响 haystack 安装,但是一旦我删除了所有软件包并重新安装它们,我就设法让 haystack 运行

于 2011-06-20T16:11:56.983 回答