Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Indexing 如何使用Haystack、Whoosh和Django迭代两个或多个模板索引_Indexing_Django Haystack_Whoosh - Fatal编程技术网

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版本,我就无法完成问题中的计划了?谢谢分享!谢谢分享!