在使用带有django的haystack时,为具有外键和多对多字段的模型创建更好和更有效的搜索索引所需的建议.
样品型号:
class Resource(models.Model):
title = models.CharField(max_length=255)
description = models.TextField(blank=True, null=True)
content = models.ForeignKey(ResourceContent, unique=True)
metadata = models.ManyToManyField(MetaData)
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用elasticsearch后端设置haystack搜索我收到以下错误:
./manage.py rebuild_index
...
Failed to clear Elasticsearch index: (404, u'IndexMissingException[[haystack] missing]')
Run Code Online (Sandbox Code Playgroud)
但是,以下命令有效:
curl -XPUT http://33.33.33.1:9200/haystack
{"ok":true,"acknowledged":true}
curl -XGET http://33.33.33.1:9200/haystack/test/something
{"_index":"haystack","_type":"test","_id":"something","exists":false}
Run Code Online (Sandbox Code Playgroud)
现在,跑完了
./manage.py rebuild_index
...
Failed to clear Elasticsearch index: (404, u'IndexMissingException[[haystack] missing]')
Run Code Online (Sandbox Code Playgroud)
再次,突然现在按预期工作的命令会出现以下错误:
curl -XGET http://33.33.33.1:9200/haystack/test/something
{"error":"IndexMissingException[[haystack] missing]","status":404}
Run Code Online (Sandbox Code Playgroud)
正如其他地方所建议的那样,我也试过:
from django.core import management
from haystack import connections
backend = connections['default'].get_backend()
backend.setup_complete = False
backend.existing_mapping = None
management.call_command('rebuild_index', interactive=False, verbosity=0)
Run Code Online (Sandbox Code Playgroud)
结果相同:
{"error":"IndexMissingException[[haystack] missing]","status":404}
Run Code Online (Sandbox Code Playgroud)
我正在运行Django 1.4.2,来自github的django-haystack HEAD和来自github的pyelasticsearch HEAD
配置:
HAYSTACK_CONNECTIONS = {
'default': {
'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
'URL': 'http://33.33.33.1:9200/',
'INDEX_NAME': 'haystack',
}, …Run Code Online (Sandbox Code Playgroud) 如果我的某个搜索索引上有MultiValueField,并且我想在搜索结果中显示每个值,我该怎么做?似乎某些东西没有被正确格式化,或者我在某种程度上误解了MultiValueField?
class PageAttachmentIndex(indexes.SearchIndex):
# This should reference search/indexes/pages/pageattachment_text.txt
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='name')
page = indexes.IntegerField(model_attr='page_id')
attrs = indexes.MultiValueField()
file = indexes.CharField(model_attr='file')
filesize = indexes.IntegerField(model_attr='file__size')
timestamp = indexes.DateTimeField(model_attr='timestamp')
url = indexes.CharField(model_attr='page')
def prepare_attrs(self, obj):
""" Prepare the attributes for any file attachments on the
current page as specified in the M2M relationship. """
# Add in attributes (assuming there's a M2M relationship to
# attachment attributes on the model.) Note that this will NOT
# get picked up …Run Code Online (Sandbox Code Playgroud) 我正在使用django-haystack在我的网站上搜索.我的问题是,如果在特定字段中找到搜索词,我希望将搜索结果放在首位.假设我搜索博客条目,然后我想在标题字段中找到搜索词的顶部显示这些结果.
我阅读了有关现场助推的干草堆文档,但我不明白它应该如何工作.
我有这样的模型:
class MyModel(models.Model):
desc1 = models.TextField(blank=True, default="")
desc2 = models.TextField(blank=True, default="")
Run Code Online (Sandbox Code Playgroud)
我想在这个模型的字段上搜索字符串.假设MyModel的这些实例:
1: desc1="ABc?", desc2="asdasd you"
2: desc1="Hello, How are you?", desc2="Thank you!"
3: desc1="ABc?", desc2="ajdf"
Run Code Online (Sandbox Code Playgroud)
当我搜索"你"时,它应该显示我,第一和第二个实例.最后我需要显示desc1中"你"比其他人更高的结果.例如,在此示例中,第二个应高于第一个.
我使用了haystack进行搜索并为此创建了一个模板.但我无法解决优先问题.
尝试通过布尔值过滤SearchQuerySet对我来说不起作用.(我在测试时使用提供的"简单"后端搜索引擎.)
我有一个像这样的索引:
class MyIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
has_been_sent = indexes.BooleanField(model_attr='has_been_sent')
# other fields
def get_model(self):
return MyModel
Run Code Online (Sandbox Code Playgroud)
我使用自定义表单进行搜索:
BOOLEAN_OPTIONS = [ ('either', 'Either'), ('yes', 'Yes'), ('no', 'No') ]
class MyModelSearchForm(SearchForm):
# other fields
has_been_sent = forms.ChoiceField( widget = forms.Select(), label = 'Sent?', choices=BOOLEAN_OPTIONS )
def search(self):
sqs = super(MyModelSearchForm, self).search()
if not self.is_valid(): return self.no_query_found()
sqs = sqs.models(MyModel) # cuts out other models from the search results
if self.cleaned_data['has_been_sent'] != 'either':
if self.cleaned_data['has_been_sent'] == 'yes': sent = True …Run Code Online (Sandbox Code Playgroud) 我有两个模型如下.权限结构允许Person查看具有与它们共同的Group的任何对象,因此如果Person在组1,2和3中,并且Object与组3,4,5共享,则Person可以通过第3组看到它.
class Person(models.Model):
groups = models.ManyToManyField(Group)
class Object(models.Model):
groups = models.ManyToManyField(Group)
Run Code Online (Sandbox Code Playgroud)
SearchIndex是这样的:
class ObjectIndex(indexes.SearchIndex, indexes.Indexable):
groups = indexes.MultiValueField(null=True)
def prepare_groups(self, obj):
return [group.pk for group in obj.groups.all()] or None
Run Code Online (Sandbox Code Playgroud)
那么,创建一个SearchQuerySet允许我采取类似的东西的最佳方法SearchQuerySet().models(Object).filter(groups=aperson.groups.all())是在组而不是AND上使用OR?
使用prepare_FOO(self, object)方法,我试图索引一个ForeignKey来获取name我的标签的属性(旅行,家庭,...)
这是我的模特
class Blog(models.Model):
title = models.CharField(max_length=500)
description = models.TextField(blank=True, null=True)
tag = models.ForeignKey(Tag)
#...
Run Code Online (Sandbox Code Playgroud)
在我的search_index.py中,这就是我所拥有的:
class BlogIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
title = indexes.CharField(model_attr='title')
description = indexes.CharField(model_attr='description')
tag_name = indexes.CharField()
def get_model(self):
return Blog
def prepare_tag_name(self, obj):
return obj.tag.name
def index_queryset(self, using=None):
return self.get_model().objects.all().select_related('blog__tag')
Run Code Online (Sandbox Code Playgroud)
......还有我的blog_text:
{{ object.title }}
{{ object.description }}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激,谢谢!
当我在haystack和elasticsearch支持的应用程序中运行"python manage.py rebuild_index"时出现问题.
Python 2.7 Django版本1.6.2 Haystack 2.1.0 Elasticsearch 1.0
请查看出现的错误:
回溯(最近一次调用最后一次):文件"manage.py",第10行,在execute_from_command_line(sys.argv)文件"/usr/lib/python2.7/site-packages/django/core/management/ init .py" ,第399行,> execute_from_command_line utility.execute()文件"/usr/lib/python2.7/site-packages/django/core/management/ init .py",第392行,>执行self.fetch_command(子命令) .run_from_argv(self.argv)文件"/usr/lib/python2.7/site-packages/django/core/management/base.py",第242行,> run_from_argv self.execute(*args,**options.dict)文件"/usr/lib/python2.7/site-packages/django/core/management/base.py",第285行,执行输出= self.handle(*args,**options)文件"/ usr /lib/python2.7/site-packages/haystack/management/commands/rebuild_index.py",第15行,句柄call_command('clear_index',**options)文件"/usr/lib/python2.7/site- packages/django/core/management/init .py",第159行,在call_command中返回klass.execute(*args,**defaults)文件"/usr/lib/python2.7/site-packages/django/core/managem ent/base.py",第285行,执行输出= self.handle(*args,**options)文件"/usr/lib/python2.7/site-packages/haystack/management/commands/clear_index.py" ,第48行,句柄后端=连接[backend_name] .get_backend()文件"/usr/lib/python2.7/site-packages/haystack/utils/loading.py",第98行,getitem self._connections [key ] = load_backend(self.connections_info [key] ['ENGINE'])(using = key)文件"/usr/lib/python2.7/site-packages/haystack/utils/loading.py",第51行,在load_backend中返回import_class(full_backend_path)文件"/usr/lib/python2.7/site-packages/haystack/utils/loading.py",第18行,在import_class中模块_itself = importlib.import_module(module_path)文件"/ usr/lib/python2 .7/site-packages/django/utils/importlib.py",第40行,在import_module 导入(名称)文件"/usr/lib/python2.7/site-packages/haystack/backends/elasticsearch_backend.py",行21,在提出MissingDependency("'elasticsearch'后端需要安装'requests'.")haystack.exceptions.Mis singDependency:'elasticsearch'后端需要安装'requests'.
我已经安装了运行这些应用程序所需的所有软件包,但询问请求是什么,它是什么?
我正面临一个奇怪的问题,使用Django Haystack和ElasticSearch,阻止我索引内容.
ElasticSearch在机器上正常运行:
# curl -X GET 127.0.0.1:9200
{
"status" : 200,
"name" : "White Pilgrim",
"cluster_name" : "elasticsearch",
"version" : {
"number" : "1.7.4",
"build_hash" : "0d3159b9fc8bc8e367c5c40c09c2a57c0032b32e",
"build_timestamp" : "2015-12-15T11:25:18Z",
"build_snapshot" : false,
"lucene_version" : "4.10.4"
},
"tagline" : "You Know, for Search"
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用Haystack构建索引时:
# python manage.py rebuild_index
Run Code Online (Sandbox Code Playgroud)
我收到一个ProtocolError(('Connection aborted.', error(111, 'Connection refused')))错误:
ERROR:root:Error updating auth using default
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/haystack/management/commands/update_index.py", line 188, in handle_label
self.update_backend(label, using)
File …Run Code Online (Sandbox Code Playgroud)