Indexing 如何使用Haystack、Whoosh和Django迭代两个或多个模板索引
我正在阅读文档和一些问题,不明白如何返回一个字段索引为两个不同类的查询。让我把代码放在下面: 我有以下课程:Indexing 如何使用Haystack、Whoosh和Django迭代两个或多个模板索引,indexing,django-haystack,whoosh,Indexing,Django Haystack,Whoosh,我正在阅读文档和一些问题,不明白如何返回一个字段索引为两个不同类的查询。让我把代码放在下面: 我有以下课程: class T031003Index(RealTimeSearchIndex): text = CharField(document=True, use_template=True) C003INST = IntegerField(model_attr='C003INST') C003CHCD = CharField(model_attr='C003CHCD') C003MTR = Ch
class T031003Index(RealTimeSearchIndex):
text = CharField(document=True, use_template=True)
C003INST = IntegerField(model_attr='C003INST')
C003CHCD = CharField(model_attr='C003CHCD')
C003MTR = CharField(model_attr='C003MTR')
C003RZSC = CharField(model_attr='C003RZSC')
def index_queryset(self):
return T031003.objects.all()
def prepare(self, obj):
self.prepared_data = super(T031003Index, self).prepare(obj)
self.prepared_data['text'] = obj.C003CHCD
return self.prepared_data
site.register(T031003, T031003Index)
第二个:
class T031002Index(RealTimeSearchIndex):
text = CharField(document=True, use_template=True)
C002USER = CharField(model_attr='C002USER')
def index_queryset(self):
return T031002.objects.all()
def prepare(self, obj):
self.prepared_data = super(T031002Index, self).prepare(obj)
self.prepared_data['text'] = obj.C002USER
return self.prepared_data
site.register(T031002, T031002Index)
我有两个模板索引:
T031003_文本:
{{ object.C003INST }}
{{ object.C003CHCD }}
{{ object.C003MTR }}
{{ object.C003RZSC }}
T031002_文本:
{{ object.C002USER }}
{{ object.C002INST }}
我的模板代码:
{% if page.object_list %}
{% for object in page.object_list %}
<br>
<li><font class="font">
{{ object.C003RZSC }}, {{ object.C003INST }}, {{ object.C003CHCD }}, {{ object.C003MTR }}, {{ object.C002USER }}
</li>
{% endfor %}
如果我在搜索框中键入一个字段中的值,比如说,它属于T031002Index类(如user=“vane”),它会给出以下结果:
“无,无,无,无,无,叶片”
如果我从T031003Index类中的字段中键入一个值,它将给出结果:
铅笔,1支,教材,一般,无
在models.py中,这两个类之间有一个外键字段,即C002INST
你们能给我解释一下吗?这似乎很容易,但我一个人想不出来
提前谢谢 所以,在亲密朋友的一点帮助和大量研究之后,我可以找到解决方案 1) 我从Haystack 1.2.6升级到Haystack 2.0.0 2) 在我看来,我将代码更改为使用AutoQuery和SearchQuerySet。它让您可以使用多个词来搜索内容,并过滤结果 以下是观点:
def search(request):
sqs = SearchQuerySet().filter(content=AutoQuery(request.GET['q']))
return render_to_response('search.html', {'sqs': sqs,})
4) 现在,在“search_indexes.py”中,我将代码更改为遵循Haystack的2.0.0版本,并从外键(T031002Index,C002INST字段)中删除“model_attr”
代码如下:
class T031003Index(RealTimeSearchIndex,Indexable):
text = CharField(document=True, use_template=True)
C003INST = IntegerField(model_attr='C003INST')
C003CHCD = CharField(model_attr='C003CHCD')
C003MTR = CharField(model_attr='C003MTR')
C003RZSC = CharField(model_attr='C003RZSC')
def index_queryset(self):
return T031003.objects.all()
def get_model(self):
return T031003
class T031002Index(RealTimeSearchIndex,Indexable):
text = CharField(document=True, use_template=True)
C002INST = CharField()
C002USER = CharField(model_attr='C002USER')
def index_queryset(self):
return T031002.objects.all()
def get_model(self):
return T031002
但即使有了所有这些更改,Haystack也会迭代这两个索引,并返回空结果。这是错误的,也会导致用户混淆。因此,我更改了模板,仅当字段的结果不为空时才显示字段:
{% if page.object_list %}
{% for result in page.object_list %}
{% if result.object.C003MTR%}
<li><b>Matrícula:</b> {{ result.object.C003MTR }}</li>
<li><b>CPF/CNPJ:</b> {{ result.object.C003CHCD }}</li>
{% endif %}
{% if result.object.C002INST %}
<li><b>ID Instituição:</b> {{ result.object.C002INST }}</li>
<li><b>Usuário:</b> {{ result.object.C002USER }}</li>
{% endif %}
{%endfor%}
{%if page.object\u list%}
{page.object_list%}中的结果为%
{%if result.object.C003MTR%}
材料:{{result.object.C003MTR}
CPF/CNPJ:{{result.object.C003CHCD}
{%endif%}
{%if result.object.C002INST%}
ID Instituição:{{result.object.C002INST}}
Usuário:{{result.object.C002USER}
{%endif%}
{%endfor%}
“if”将测试字段是否有空结果
希望它能帮助其他使用Haystack和Django的开发人员。因此,在亲密朋友的一点帮助和大量研究之后,我可以找到解决方案 1) 我从Haystack 1.2.6升级到Haystack 2.0.0 2) 在我看来,我将代码更改为使用AutoQuery和SearchQuerySet。它让您可以使用多个词来搜索内容,并过滤结果 以下是观点:
def search(request):
sqs = SearchQuerySet().filter(content=AutoQuery(request.GET['q']))
return render_to_response('search.html', {'sqs': sqs,})
4) 现在,在“search_indexes.py”中,我将代码更改为遵循Haystack的2.0.0版本,并从外键(T031002Index,C002INST字段)中删除“model_attr”
代码如下:
class T031003Index(RealTimeSearchIndex,Indexable):
text = CharField(document=True, use_template=True)
C003INST = IntegerField(model_attr='C003INST')
C003CHCD = CharField(model_attr='C003CHCD')
C003MTR = CharField(model_attr='C003MTR')
C003RZSC = CharField(model_attr='C003RZSC')
def index_queryset(self):
return T031003.objects.all()
def get_model(self):
return T031003
class T031002Index(RealTimeSearchIndex,Indexable):
text = CharField(document=True, use_template=True)
C002INST = CharField()
C002USER = CharField(model_attr='C002USER')
def index_queryset(self):
return T031002.objects.all()
def get_model(self):
return T031002
但即使有了所有这些更改,Haystack也会迭代这两个索引,并返回空结果。这是错误的,也会导致用户混淆。因此,我更改了模板,仅当字段的结果不为空时才显示字段:
{% if page.object_list %}
{% for result in page.object_list %}
{% if result.object.C003MTR%}
<li><b>Matrícula:</b> {{ result.object.C003MTR }}</li>
<li><b>CPF/CNPJ:</b> {{ result.object.C003CHCD }}</li>
{% endif %}
{% if result.object.C002INST %}
<li><b>ID Instituição:</b> {{ result.object.C002INST }}</li>
<li><b>Usuário:</b> {{ result.object.C002USER }}</li>
{% endif %}
{%endfor%}
{%if page.object\u list%}
{page.object_list%}中的结果为%
{%if result.object.C003MTR%}
材料:{{result.object.C003MTR}
CPF/CNPJ:{{result.object.C003CHCD}
{%endif%}
{%if result.object.C002INST%}
ID Instituição:{{result.object.C002INST}}
Usuário:{{result.object.C002USER}
{%endif%}
{%endfor%}
“if”将测试字段是否有空结果
希望它能帮助其他使用Haystack和Django的开发人员。我正在阅读Haystack的索引页面,其中有一些内容引起了我的注意:与此同时,2.0.0-alpha的工作已经成功,包括期待已久的多索引支持。与Django的multidb支持类似,这将允许您同时与多个搜索引擎对话。像主从式设置、一个独立的自动完成引擎或面向公众/管理员的分割式搜索引擎现在都变得微不足道了……”是吗?如果我不使用2.0 Haystack版本,我就无法完成我在问题中的计划?我正在阅读Haystack的索引页,有一件事引起了我的注意:“与此同时,2.0.0-alpha的工作已经击中了master,包括期待已久的多索引支持。与Django的multidb支持类似,这将允许您同时与多个搜索引擎对话。像主从式设置、独立的自动完成引擎或面向公众/管理员的分割搜索引擎现在都变得微不足道了……”是吗?如果我不使用2.0 Haystack版本,我就无法完成问题中的计划了?谢谢分享!谢谢分享!