首页 > 编程问答 >Django Haystack 多值字符串分面——未知字段tags_exact

Django Haystack 多值字符串分面——未知字段tags_exact

时间:2024-07-28 14:32:43浏览次数:18  
标签:python django django-haystack

我网站上的内容用可变长度的字符串标记,我想对这些标记进行分面搜索。 例如,一个故事可能有标签“内战”、“格兰特将军”和“葛底斯堡之战”。 我希望能够对精确的非标记化字符串进行分面搜索。

在我的 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 字段。

标签:python,django,django-haystack
From: 12967184

相关文章

  • SSL 证书验证失败 - 雅虎财经 API - Python
    我正在尝试从雅虎财经获取数据,但收到SSL错误。代码如下:importrequestsresponse=requests.get("https://query1.finance.yahoo.com/v8/finance/chart/META",verify=True)print(response.status_code)出现以下错误:urllib3.exceptions.SSLError:[SSL:CERTIFICATE_......
  • 【学习笔记】Matlab和python双语言的学习(熵权法)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、熵权法的基本概念二、熵权法的基本步骤1、构建决策矩阵2、数据标准化3、计算指标的比重4、计算信息熵5、计算权重6、计算综合得分三、代码实现----Matlab四、代码实现----python总结......
  • 【python】网络通信编程例子
    以下是一个简单的Python示例,展示了如何在Linux下使用套接字进行基本的网络通信,包括创建服务器和客户端。服务器端代码importsocket#创建一个IPv4TCP套接字server_socket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)#绑定服务器地址和端口server_addr......
  • 如何将Python版本从3.9降级到3.7?
    我正在开发RaspberryPi。这些是我的操作系统信息:pi@raspberrypi:~$uname-marmv7lpi@raspberrypi:~$cat/etc/os-releasePRETTY_NAME="RaspbianGNU/Linux11(bullseye)"NAME="RaspbianGNU/Linux"VERSION_ID="11"VERSION="11(bullseye)......
  • Python终端输出彩色字符方法
    colorama是一个python专门用来在控制台、命令行输出彩色文字的模块,完全兼容linux和windows各个版本。 1.Python3.x中安装colorama模块: pipinstallcolorama'''可用格式常数:【颜色RED,GREEN都需要大写】Fore:BLACK,RED,GREEN,YELLOW,BLUE,MAGENTA,CYAN,WHI......
  • 我无法安装 pygame 模块,所以我尝试观看视频,它告诉我这样做。在那个视频中他得到了 pyt
    c:\User\admin>piplistSyntaxError:unexpectedcharacterafterlinecontinuationcharacter我试图获取python模块列表,但出现语法错误出现SyntaxError:unexpectedcharacterafterlinecontinuationcharacter错误是因为你的用户名中包含一个特殊字符......
  • python第五节--conda命令
    这里写自定义目录标题基本命令环境管理包管理环境文件环境变量Conda配置高级操作常见问题基本命令检查Conda版本:conda--version更新Conda:condaupdateconda环境管理创建新环境:condacreate--namemyenv创建包含特定Python版本的新环境:conda......
  • 如何使用python向另一台计算机发送请求
    基本上我有一个聊天室,我将把它变成一个网络(我知道这听起来没有多大意义),但基本上我想知道是否可以让python脚本捕获计算机上的所有传出请求并将其发送到另一台计算机(c2)。然后我希望c2自己发出请求。这是对我正在做的事情的淡化解释,但任何帮助都会很棒!当然可以!虽然从头......
  • AttributeError:'int'对象没有属性'index'(python)
    我正在Python上进行“猜单词”,但我无法弄清楚这个错误。AttributeError:'int'objecthasnoattribute'index'(python)它在线上给了我一个错误letterIndex=word.index(guess)defcheckLetter(word):blanks='_'*len(str(word))print('W......
  • 尝试在Python中使用for循环来输出大于或等于序列中的数字
    这是我的Python代码:largest_so_far=-1print('before',largest_so_far)forthe_numin[9,41,12,3,74,15]:ifthe_num>largest_so_far:largest_so_far=the_numprint(largest_so_far,'isbiggerthan',the_num)......