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
假设我有一个如下所示的 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