我网站上的内容用可变长度的字符串标记,我想对这些标记进行分面搜索。 例如,一个故事可能有标签“内战”、“格兰特将军”和“葛底斯堡之战”。 我希望能够对精确的非标记化字符串进行分面搜索。
在我的 search_index.py 中,我定义了:
tags = MultiValueField(faceted=True, indexed=True)
并且我编辑了 build_solr_schema 生成的 schema.xml 以使标签成为字符串而不是text:
<field name="tags" type="string" indexed="true" stored="true" multiValued="true" />
不幸的是,当我收到有关tags_exact的错误时:
Failed to add documents to Solr: [Reason: None]
ERROR: [doc=application_stories.story.1] unknown field 'tags_exact'
我知道tags_exact字段与Haystack的分面内部实现有关,但我该如何解决这个问题呢?
这个错误信息表明 Haystack 试图在你的 Solr schema 中查找名为
tags_exact
的字段,但找不到。这是因为 Haystack 在处理多值字符串字段的分面时,默认会使用
*_exact
后缀来创建额外的字段用于精确匹配。
解决这个问题的方法有两种:
方法一:为每个多值字段添加
*_exact
字段
你可以在你的 Solr schema 文件 (
schema.xml
) 中手动添加
tags_exact
字段。这个字段的定义应该和
tags
字段类似,只是名称不同:
<field name="tags_exact" type="string" indexed="true" stored="true" multiValued="true" />
方法二:使用
FacetMultiValueField
Haystack 提供了一个名为
FacetMultiValueField
的字段类型,专门用于处理多值字符串字段的分面。它会自动处理
*_exact
字段的创建,无需手动添加。
在你的
search_index.py
文件中,将
MultiValueField
替换为
FacetMultiValueField
:
from haystack.fields import FacetMultiValueField
class StoryIndex(SearchIndex, Indexable):
# ... other fields ...
tags = FacetMultiValueField(faceted=True, indexed=True)
使用
FacetMultiValueField
后,Haystack 会自动在 Solr 中创建
tags_exact
字段,并使用它进行精确匹配的分面搜索。
总结:
-
使用
MultiValueField
时,你需要手动在 Solr schema 中添加*_exact
字段。 -
使用
FacetMultiValueField
时,Haystack 会自动处理*_exact
字段的创建,更加方便。
建议使用
FacetMultiValueField
来简化你的代码,并避免手动管理
*_exact
字段。