1

我正在使用 Django Haystack进行搜索。

只想title在搜索结果时定位我模型的字段。

但是,目前,如果搜索词在我的模型中的任何字段中,它都会返回结果。

例如:搜索xyz会给出xyzbio字段中的结果。

这不应该发生,我只想返回xyz在该title字段中的结果。Artist.title完全忽略除搜索之外的所有其他字段。

artists/models.py

class Artist(models.Model):
    title = models.CharField(max_length=255)
    slug = models.SlugField(max_length=100)
    strapline = models.CharField(max_length=255)
    image = models.ImageField(upload_to=get_file_path, storage=s3, max_length=500)
    bio = models.TextField()

artists/search_indexes.py

from haystack import indexes
from app.artists.models import Artist

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True, model_attr='title')

    def get_model(self):
        return Artist

我想把它想象成一个 SQL 查询:

SELECT * FROM artists WHERE title LIKE '%{search_term}%'

更新

按照删除 use_template=True 的建议,我的 search_indexes.py 现在看起来像:

from haystack import indexes
from app.artists.models import Artist


class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, model_attr='title')
    title = indexes.CharField(model_attr='title')

    def get_model(self):
        return Artist

但我有同样的问题。(试过python manage.py rebuild_index)

如果这有什么不同,这是我的 Haystack 设置:

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.simple_backend.SimpleEngine',
    },
}
4

4 回答 4

4

model_attr并且 use_template不要一起工作。在这种情况下,当您查询单个模型属性时,无需使用模板。搜索索引中的模板纯粹是为了对数据进行分组。

因此,您最终得到:

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, model_attr='title')

    def get_model(self):
        return Artist
于 2013-08-14T10:10:05.513 回答
1

如果您的索引没有任何其他用例(即应该与其他地方的术语匹配的搜索),您根本不需要use_template(将use_template参数设置为False并放弃您的搜索模板),您就完成了。FWIW 请注意,传递参数Trueuse_templatemodel_attr被忽略。此外,您可能没有使用全文搜索引擎,您可能只使用 Django 的标准 QuerySet 查找 API,即Artist.objects.filter(title__icontains=searchterm).

否则 - 如果您仍然需要“完整”文档索引来进行其他搜索,并且只想将此搜索限制为您也可以为标题title添加另一个index.CharField(带有)并且仅在此字段上搜索。document=False, model_attr='title'Haystack 的 SearchQuerySet API 文档中完整记录了如何执行此操作。

于 2013-08-14T10:14:24.420 回答
0

从文档

此外,我们在use_template=True文本字段中提供。这允许我们使用数据模板(而不是容易出错的连接)来构建搜索引擎将在搜索中使用的文档。您需要在名为的模板目录中创建一个新模板search/indexes/myapp/note_text.txt,并将以下内容放入:

{{ object.title }}
{{ object.user.get_full_name }}
{{ object.body }}

所以我想在这个模板中你可以声明哪些字段应该被索引/搜索

另一种方法是覆盖def prepare(self, object)Index 类并明确定义需要索引/搜索的字段。或者只是使用model_attr

于 2013-08-14T10:06:08.087 回答
0

基本上你的search_indexes.py文件写错了。它应该是这样的: -

from haystack import indexes
from app.artists.models import Artist

class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title= indexes.CharField(model_attr='title',null=True)

def get_model(self):
    return Artist

def index_queryset(self, using=None):
    return self.get_model().objects.all()

然后你必须在你的应用程序中创建一个模板。目录结构如下:

模板/搜索/索引/艺术家/artist_text.txt

并将以下代码添加到 artist_text.txt 文件中:

{{ object.title }}

现在做python manage.py rebuild_index。

现在它将仅返回标题的结果。

于 2017-09-22T05:56:53.617 回答