2017-02-13 59 views
0

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

我发的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() 
+0

你可以分享你的searchIndex模式对应的相同。 –

+0

@BipulJain你的意思是代码? – mark

+0

是的。你必须有具体的searchIndex search_indexes.py –

回答

1

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

对于例如:如果你纽约将记号化,并确保您的文档符合条件像NE,新,哟,尤尔和约克。 EdgeNGram字段通常用于自动提示,因为它在查询和索引时将它标记为这种形式的单词。

您可以将模式更改为CharField。这样它会zo-zo将转换为zo zo这将匹配Zo-zo在您的索引

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

按照您的意图进行匹配。它只会以这种方式支持确切的单词匹配。

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

+0

非常感谢你的amswer。请你能告诉我如何在模型中使用CharField和EdgeNGramField?我需要EdgeNGramField。我试过'text_1 = indexes.CharField(document = True,use_template = True)',但我只能用'document = True'来设置一个字段 – mark

相关问题