带破折号的名称在django-haystack中不起作用

时间:2017-02-13 11:43:55

标签: python django search django-haystack

我正在开发基于django 1.8和搜索引擎django-haystack 2.4.1的应用程序。 一个奇怪的情况,因为当我搜索单词"New York"时 - 一切都很好。 例如,当事件名称中有一个奇怪的名字时。 "Zo-zo on"(使用破折号)搜索未显示正确的结果,只有页面隔离了字母实例,例如:"zo ..."

我做了rebuild_index

class EventIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.EdgeNgramField(document=True, use_template=True)
    id = indexes.CharField(model_attr='id')
    get_absolute_url = indexes.CharField(model_attr='get_absolute_url')
    description = indexes.CharField(model_attr='description', null=True)
    is_past = indexes.CharField(model_attr='is_past', default='false')
    date_start = indexes.DateTimeField(model_attr='date_start')

    def get_model(self):
        return Booking

    def index_queryset(self, using=None):
        date_past = now() - timedelta(days=1)
        return self.get_model().published.filter(date_start__gt=date_past).filter(id=7353)

    def read_queryset(self, using=None):
        return self.get_model().all_objects.all()

1 个答案:

答案 0 :(得分:1)

基于您的搜索索引架构。您正在使用EdgeNGramField,它将您提供给它的所有内容标记为大小为2或更多的标记。

例如:如果您纽约,它会标记并确保您的文档符合 ne,new,yo,yor和york 等字词。 EdgeNGram字段通常用于autosuggest,因为它在查询和索引时将字标记为这些形式。

您可以将架构更改为CharField。这样它 zo-zo 将转换为 zo zo ,它将与索引中的 Zo-zo on 相匹配。

class EventIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

像你想要的那样做一场比赛。它只支持那种精确的单词匹配。

如果您打算保留EdgeNGram字段,请创建一个单独的字段。