Django Haystack select 要搜索的字段

Django Haystack select which fields to search

假设我有一个如下所示的 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也仅限于一个字段过滤。

您可以使用 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”进行查询,请使用 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