我有一个基本的django haystack elasticsearch安装正在运行,这似乎正在运行..直到我遇到自动完成问题: 它不会在完整字段中返回自动完成。另一个问题是有CAPS的数据,没有规范化(例如用户名......)
我的安装:
django 1.6.4 haystack 2.1.0 elasticsearch 1.3.1 py-elasticsearch 0.6.1class SocialProfileIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
username = indexes.CharField(model_attr='username')
first_name = indexes.CharField(model_attr='first_name')
last_name = indexes.CharField(model_attr='last_name')
# Auto-complete
username_auto = indexes.EdgeNgramField(model_attr='username')
first_name_auto = indexes.EdgeNgramField(model_attr='first_name')
last_name_auto = indexes.EdgeNgramField(model_attr='last_name')
def get_model(self):
return SocialProfile
def index_queryset(self, using=None):
return self.get_model().objects.all()
我在视图中返回:
results = SearchQuerySet().models(SocialProfile).autocomplete(username_auto=q)
所以索引社交档案时:
username=alonisser
当q(查询)是' alonisser'我得到了正确的答复,但是当我尝试“alon'或类似的我没有得到任何结果。
当我通过py-elasticsearch(没有haystack)直接访问elasticsearch时:
es = Elasticsearch('http://elasticsearch.url:9200')
es.search('username_auto:alon', index='haystack')
我确实得到了正确的结果,所以存储在那里,问题可能是干草堆出错了。
类似但不同的问题是当搜索的项目具有上限时:例如' Alonisser'所以搜索alonisser'不会返回任何结果,但会搜索Alonisser'确实
我做错了什么?谢谢你的帮助..
答案 0 :(得分:1)
我认为你已经在干草堆论坛上得到了答案,但也是为了把它带出来。
解决Caps问题的一种方法是在索引类中使用自定义prepare方法,尽管我的haystack默认以某种方式处理它:S。
def prepare_username_auto(self, obj):
return obj.username.lower()
当您运行“update_index”时,这会将所有用户名转换为小写。然后,您还可以将用户插入的搜索词转到较低的位置,这样可以产生正确的结果。
要搜索您需要使用的单词的一部分:
results = SearchQuerySet().models(SocialProfile).autocomplete(username_auto__startswith=q)