6

我有一个这样的模型:

class MyModel(models.Model):
    desc1 = models.TextField(blank=True, default="")
    desc2 = models.TextField(blank=True, default="")

我想在这个模型的字段上搜索字符串。假设 MyModel 的这些实例:

1: desc1="ABc?", desc2="asdasd you"
2: desc1="Hello, How are you?", desc2="Thank you!"
3: desc1="ABc?", desc2="ajdf"

当我搜索“你”时,它应该向我显示第一个和第二个实例。最后,我需要显示 desc1 中“你”的结果高于其他结果。例如,在此示例中,第二个应该高于第一个。

我已经使用 haystack 进行搜索并为此创建了一个模板。但我无法解决优先级问题。

4

2 回答 2

3

当您说“优先级”时,您的真正意思是“排序”,用搜索的术语来说。

Django Haystack 可以按字段匹配排序,但它可以按“分数”排序,它使用算法来确定排序顺序。您可以通过“提升”来影响分数的权重——参见 http://django-haystack.readthedocs.org/en/latest/boost.html

此外,您应该考虑在 search_indexes.py 中添加仅用于加权的额外字段。您不需要在 Django 模型字段和索引之间进行一对一的映射。就像是

class MyModelIndex(QueuedSearchIndex):
    desc1 = indexes.CharField()
    desc2 = indexes.CharField()
    otherWeightedField = indexes.CharField()

    def prepare_otherWeightedField(self,obj)
        # fill the extra field with extra stuff to help you sort, based on processing values from other fields
于 2012-07-26T18:23:03.057 回答
3

我使用这种方法。

from types import ListType
from haystack import indexes


class DocumentField(indexes.SearchField):
    """An index field that combines and weights other fields because Haystack
    does not provide for weighted searching. This field makes use of other
    existing field classes for DRY."""

    def __init__(self, *args, **kwargs):
        self.fields = kwargs.pop("fields", None)
        super(DocumentField, self).__init__(*args, **kwargs)
        self.document = True
        self.use_template = False

    def prepare(self, obj):
        values = []

        for field_instance in self.fields.values():
            v = field_instance.prepare(obj)
            if not v:
                continue
            if not isinstance(v, ListType):
                v = [v]
            # Apply boost
            v = v * int(field_instance.boost * 10)
            values.extend(v)

        return "\n".join(values)


class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
    text = DocumentField(fields=dict(
        desc1 = indexes.CharField(model_attr="desc1", boost=1.0),
        desc2 = indexes.CharField(model_attr="desc2", boost=0.7)
    ))

    def get_model(self):
        return MyModel
于 2016-12-06T15:32:05.623 回答