django - Django干草堆Elasticsearch的自动完成问题(以及带有大写字母的查询)

标签 django autocomplete elasticsearch django-haystack

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

我的安装:

Django 1.6.4
干草堆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()

在我返回的 View 中:
results = SearchQuerySet().models(SocialProfile).autocomplete(username_auto=q)

因此,在为SocialProfile建立索引时:
username=alonisser

当q(查询)为'alonisser'时,我得到正确的答复,但是当我尝试'alon'或类似方法时,我没有得到任何结果。

当我直接通过py-elasticsearch(没有干草堆)访问elasticsearch时:
es = Elasticsearch('http://elasticsearch.url:9200')
es.search('username_auto:alon', index='haystack')

我的确得到了正确的结果,因此将其存储在该位置,问题可能出在干草堆上。

类似但不同的问题是,当搜索到的商品带有Caps时(例如“Alonisser”),因此搜索“alonisser”不会返回任何结果,但是搜索“Alonisser”会返回任何结果。

我究竟做错了什么?谢谢您的帮助..

最佳答案

我认为您已经在干草堆论坛中得到了答案,但也只是想在这里提出来。

摆脱Caps问题的一种方法是在索引类中使用自定义的prepare方法,尽管我的干草堆默认情况下会以某种方式处理它:S。

def prepare_username_auto(self, obj):
   return obj.username.lower()

当您运行“update_index”时,这会将所有用户名转换为小写。然后,您还可以将用户插入的搜索字词也调低,以产生正确的结果。

要搜索单词的一部分,您需要使用:
results = SearchQuerySet().models(SocialProfile).autocomplete(username_auto__startswith=q)

关于django - Django干草堆Elasticsearch的自动完成问题(以及带有大写字母的查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25380837/

相关文章:

python - Django 查询 : How to filter objects by todays day, 时间和 30 分钟后?

jQuery UI 自动完成,将结果加载到不同的位置(div)?

elasticsearch - 使elasticsearch仅返回某些字段?

elasticsearch - 如何对嵌套对象进行聚合 - Elasticsearch

python - 在 Django 中过滤评估的查询集

python - 如何使用 django-admin.py makemessages --all

html - Django:在导航栏中突出显示当前页面

linux - 如何使用文件路径自动完成 bash 命令行?

javascript - 仅使用 getOptionLabel 字段进行 Material 自动完成过滤

elasticsearch - 使用正则表达式的 Kibana 无法按预期工作