Django-Haystack elasticsearch查询

时间:2014-01-04 15:02:13

标签: elasticsearch django-haystack

Haystack生成弹性搜索查询以从弹性搜索中获取结果。查询前面加上包含以下查询的过滤器:

"query": {
    "query_string": {
        "query": "django_ct:(customers.customer)"
     }
}

django_ct(..)查询的含义是什么?这是haystack在elasticsearch中安装的功能吗?这是一些缓存魔法吗?我可以完全摆脱这部分吗?

我之所以要问的是我必须构建自定义查询才能使用elasticsearch multi_field。为了更改查询我想先了解haystack如何生成自己的查询。

1 个答案:

答案 0 :(得分:2)

Haystack使用Django的内容类型来确定要在Elasticsearch中搜索哪些模型属性。这不是最佳实践,但它是如何在HS中完成的。

基本上,HS中的代码看起来像这样:

app_name, model_name = django_ct.split('.')
ct = ContentType.objects.get_by_natural_key(app_name, model_name)
model = ct.model_class()
# do stuff with model

因此,如果要在索引中索引多个模型,那么在使用haystack时你真的不想忽略它。

我在此处基于弹性搜索还有其他几个答案:index analyzer vs query analyzer in haystack - elasticsearch?和此处:Django Haystack Distinct Value for Field

关于多字段的编辑:

我过去曾经使用过Haystack和多字段,所以我不确定你是否需要自己编写后端。关键是要了解haystack如何创建搜索。正如我在其中一篇文章中所说,一切都进入query_string,并从那里创建一个基于lucene的搜索字符串。再说一遍,不是最好的练习。

所以假设你有一个看起来像这样的多字段:

            "some_field": {
                "type": "multi_field",
                "fields": {
                    "some_field_edgengram": {
                        "type": "string",
                        "index": "analyzed",
                        "index_analyzer": "autocomplete_index",
                        "search_analyzer": "autocomplete_search"
                    },
                    "some_field": {
                        "type": "string",
                        "index": "not_analyzed"
                    }
                }
            },

在haystack中,你可以直接搜索some_field和some_field_edgengram。

例如SearchQuerySet().filter(some_field="cat")SearchQuerySet().filter(some_field_edgengram="cat")都会起作用,但第一个只会匹配具有猫的标记,第二个匹配猫,猫,猫,捕获等,至少使用我的edgengram分析仪。

但是,仅仅因为您使用haystack进行索引和搜索并不意味着您必须将其用于100%的搜索解决方案。在过去,我在应用程序的某些区域使用PYES,在其他区域使用haystack,因为haystack缺乏对更高级功能的支持,query_string解析正在失去我们正在寻找的一些更细粒度的精确度。

在你的情况下,你可以通过elasticutils或python-elasticseach从搜索引擎直接获得一些更高级的搜索结果,并使用haystack进行其他更常规的搜索。