【问题标题】:How can I iterate over two or more template indexes with Haystack, Whoosh and Django如何使用 Haystack、Whoosh 和 Django 迭代两个或多个模板索引
【发布时间】:2012-06-25 15:47:41
【问题描述】:

我正在阅读这里的文档和一些问题,但不明白如何返回包含在两个不同类中索引的字段的查询。让我把代码放在下面:

这里有课程:

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_text:

{{ object.C003INST }}
{{ object.C003CHCD }}
{{ object.C003MTR }}
{{ object.C003RZSC }}

T031002_text:

{{ 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 %}

我的看法:

def search(req):
return SearchView(template='search.html')(req)

如果我在搜索框中输入一个字段的值,比如说属于 T031002Index 类(如 user = "vane"),它会给我结果:

“无,无,无,无,风向标”

而且,如果我从 T031003Index 类的字段中输入一个值,它会给我结果:

“铅笔,1,教材,一般,无”

我在models.py的这两个类之间有一个外键字段,即C002INST。

你们能给我解释一下吗?看起来很简单,但我自己想不出来。

提前致谢!

【问题讨论】:

  • 我现在正在阅读 Haystack 的索引页面,有一些东西引起了我的注意:“同时,2.0.0-alpha 的工作已经成功,包括期待已久的多索引支持。类似于 Django 的 multidb 支持,这将允许您同时与多个搜索引擎对话。诸如主从设置、用于自动完成的单独引擎或拆分面向公众/仅限管理员的搜索之类的事情现在变得微不足道……”是这样吗?如果我不使用 2.0 Haystack 版本,我无法按照我的问题做我的计划?

标签: indexing django-haystack whoosh


【解决方案1】:

所以,在密友的帮助和大量研究之后,我找到了解决办法。

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”中,我将代码更改为遵循 2.0.0 版本的 Haystack,并从外键(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”可以测试该字段是否有空结果。

希望它能帮助其他将 Haystack 与 Django 结合使用的开发人员。

【讨论】:

  • 感谢分享!
猜你喜欢
  • 2019-10-15
  • 1970-01-01
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 2015-09-21
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多