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 进行其他更常规的搜索。