具有自动完成功能的Django haystack elasticsearch问题(以及使用大写字母的查询)

时间:2014-08-19 10:13:55

标签: django autocomplete elasticsearch django-haystack

我有一个基本的django haystack elasticsearch安装正在运行,这似乎正在运行..直到我遇到自动完成问题: 它不会在完整字段中返回自动完成。另一个问题是有CAPS的数据,没有规范化(例如用户名......)

我的安装:

django 1.6.4 haystack 2.1.0 elasticsearch 1.3.1 py-elasticsearch 0.6.1

class 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'确实

我做错了什么?谢谢你的帮助..

1 个答案:

答案 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)