我一直在努力让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
非常感谢任何建议!!
我有一个名为lactose_search的应用程序,我的HAYSTACK_SITECONF指向这个应用程序文件夹中的projectname.lactose_search,我有一个名为search_indexs.py的文件。现在我只是简单地从django cms网站c + p示例,因为它是我要搜索的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
希望这些额外信息可以让您更轻松地回答这个问题!
答案 0 :(得分:1)
这是一个我尚未遇到的奇怪问题(此处尚无人报道:https://github.com/notanumber/xapian-haystack/issues)
旧版本的Xapian-Haystack需要写入权限(能够创建索引),并在启动时进行了检查,验证了这种情况,但这已被删除。
只要该过程可以读取HAYSTACK_XAPIAN_PATH
文件夹,您就不会收到任何Permission Denied
错误。
您能确认您使用的后端版本是什么?如果可能的话,我还建议尝试用Whoosh替换后端,只是作为一个完整性检查,确保没有任何事情发生。
答案 1 :(得分:1)
您更有可能没有使用以下命令构建索引
python manage.py update_index
同样的事情发生在我身上,只需要在命令之上运行。
答案 2 :(得分:0)
我弄清楚我的问题是什么,当我将软件包安装到我的环境时,我运行sudo pip install而不是简单地使用pip。我无法解释为什么这会影响干草堆安装,但是一旦我删除了所有软件包并重新安装它们,我就设法让干草堆运行