【问题标题】:Django-Haystack elasticsearch queriesDjango-Haystack 弹性搜索查询
【发布时间】:2014-01-04 15:02:13
【问题描述】:

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

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

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

我问的原因是我必须构建一个自定义查询才能使用弹性搜索multi_field。为了更改查询,我想首先了解 haystack 如何生成自己的查询。

【问题讨论】:

    标签: elasticsearch django-haystack


    【解决方案1】:

    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 时,您真的不想忽略它。

    我在这里有几个基于 elasticsearch 的其他答案:index analyzer vs query analyzer in haystack - elasticsearch? 和这里:Django Haystack Distinct Value for Field

    关于多字段的编辑:

    我过去使用过 Haystack 和 multifields,所以我不确定您是否需要编写自己的后端。关键是了解 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") 都可以工作,但第一个只会匹配完全有 cat 的标记,第二个会匹配 cat、cats、catlin、catch 等,至少使用我的 edgengram 分析器。

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

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

    【讨论】:

    • 我对 haystack 有另一个问题:使用 multi_fields 和组合查询。除了使用自己的映射编写自己的弹性搜索后端和自定义类型之外,我看不到在 haystack 中使用这些概念的直接方法。您对此有何看法?
    • @paweloque 我添加了多字段的东西
    • 您是否使用覆盖的 build_schema 函数创建自己的自定义类型来指定 multi_field 映射?
    • @paweloque 是的,你真的不应该把 haystack 留给它自己的设备。创建映射时它会做很多错误的事情。
    猜你喜欢
    • 2015-12-28
    • 2014-08-01
    • 2012-12-29
    • 2014-11-09
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    相关资源
    最近更新 更多