【问题标题】:Django Haystack select which fields to searchDjango Haystack 选择要搜索的字段
【发布时间】:2021-12-29 15:37:47
【问题描述】:

假设我有一个像这样的 Person 模型:

class Person(models.Model):
    title = models.CharField(max_length=300, blank=True,  null=True)
    first_name = models.CharField(max_length=300, blank=True,  null=True)
    last_name = models.CharField(max_length=300, blank=False, null=False)

还有一个像这样的 Haystack 搜索索引:

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

假设模板包含所有三个字段(名字、姓氏和标题)。如果用户应该能够选择要搜索的字段,我是否需要为所有可能的排列建立单独的索引?或者我可以将搜索范围缩小到三个字段中的一个或两个?

如果有怎么办?

我知道我可以使用 .filter() 过滤 SearchQuerySets。

 SearchQuerySet().filter(first_name='foo')

但这会过滤集合以获得精确值。甚至__icontains 也仅限于一个字段过滤。

【问题讨论】:

    标签: django search django-haystack


    【解决方案1】:

    您可以使用AutoQuery 代替标准的filter

    
    from haystack.inputs import AutoQuery
    
    
    SearchQuerySet().filter(first_name=AutoQuery('foo'))
    

    https://django-haystack.readthedocs.io/en/v2.4.1/inputtypes.html#autoquery

    已编辑 为了使用“haystack”运行 OR 查询,请使用 SQ 对象:

    from haystack.backends import SQ
    from haystack.inputs import AutoQuery
    
    SearchQuerySet().filter(
        SQ(first_name=AutoQuery('foo')) | SQ(last_name=AutoQuery('foo'))
    )
    
    

    https://django-haystack.readthedocs.io/en/v2.4.1/searchquery_api.html#sq-objects

    【讨论】:

    • 谢谢!愚蠢的问题,因为文档中并不清楚:它是否适用于单词部分?例如,当它被 AutoQuery('foo') 命中时,这会过滤掉 firstname="foofoo" 吗?
    • 此外,这只解决了我能够搜索一个字段的问题。使用过滤器和自动查询,一切都由 AND 连接。我无法将搜索字符串指定为 first_name 或 last_name。
    • @1D0BE,针对您的第一条评论,我认为搜索不完整的字符串不是全文搜索系统的目的,默认情况下后端不能这样做(或者我不这样做) '不知道怎么做)。
    • 对于通过 Google 搜索来到这里的其他人。您也可以使用 Ngramfields 和 EdgeNgramfields 搜索不完整的字符串。可以在这里找到:django-haystack.readthedocs.io/en/master/searchfield_api.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-25
    相关资源
    最近更新 更多