问题描述
我正在基于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楼
确定取决于您的搜索索引架构。 您正在使用EdgeNGramField,它将赋予您的所有内容令牌化为大小2及更大的令牌。
例如:如果您是纽约人 ,它将令牌化并确保您的文档与ne,new,yo,yor和york等术语匹配。 EdgeNGram字段通常用于自动建议,因为它在查询和建立索引期间会将单词标记成这种形式。
您可以将架构更改为CharField。 这样,它会ZO-ZO将转化为莫宁莫宁将匹配ZO-ZO在你的索引。
class EventIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
按照您的意愿进行比赛。 这样只会支持完全匹配的单词。
如果要保留EdgeNGram字段,请创建一个单独的字段。