【问题标题】:Django Haystack - Indexing single fieldDjango Haystack - 索引单个字段
【发布时间】:2013-08-14 09:56:57
【问题描述】:

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

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

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

例如:搜索 xyz 会得到 xyzbio 字段中的结果。

这不应该发生,我只想返回 xyztitle 字段中的结果。完全忽略除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',
    },
}

【问题讨论】:

    标签: python django search django-haystack


    【解决方案1】:

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

    因此,您最终得到:

    class ArtistIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, model_attr='title')
    
        def get_model(self):
            return Artist
    

    【讨论】:

    • 谢谢,我已经为上面的问题添加了更新,因为这似乎没有解决我的问题。
    【解决方案2】:

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

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

    【讨论】:

    • 谢谢,我已经为上面的问题添加了更新,因为这似乎没有解决我的问题。
    • @kieran:每次更改索引定义时都必须重建整个索引。另外,您是否阅读过有关 SimpleEngine 后端的红色大警告? django-haystack.readthedocs.org/en/latest/tutorial.html#simple
    • 是的,一直在这样做。这将在准备好投入生产时移至 Solr
    • @kieran :如果您不想使用 Solr 进行开发,最好的后备方案是 Whoosh - 但只要您需要除最基本功能之外的任何东西,Haystack 最终会成为一个有点泄漏的抽象。
    【解决方案3】:

    来自文档

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

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

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

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

    【讨论】:

    • 谢谢,我已经为上面的问题添加了更新,因为这似乎没有解决我的问题。
    【解决方案4】:

    基本上你的 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.

    现在它只会返回标题的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多