Haystack生成弹性搜索查询以从弹性搜索中获取结果。查询前面加上包含以下查询的过滤器:
"query": {
"query_string": {
"query": "django_ct:(customers.customer)"
}
}
django_ct(..)
查询的含义是什么?这是haystack在elasticsearch中安装的功能吗?这是一些缓存魔法吗?我可以完全摆脱这部分吗?
我之所以要问的是我必须构建自定义查询才能使用elasticsearch multi_field
。为了更改查询我想先了解haystack如何生成自己的查询。
答案 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进行其他更常规的搜索。