看起来Format 字段基于预定义值的受限列表 - 如release format 列表页面所示。
因此,Lucene 索引可能将此字段定义为 StringField 而不是 TextField。
StringField 定义为:
被索引但未标记化的字段:整个 String 值被索引为单个标记。
这意味着您无法搜索vinyl。您需要使用准确的值,可以是以下值之一:
7" Vinyl
10" Vinyl
12" Vinyl
因此,为了解决这个问题,您可以按如下方式构建 Lucene 查询的该部分:
AND (format:"7\" vinyl" OR format:"10\" vinyl" format:"12\" vinyl")
文本值被"s 包围,以确保整个术语在查询中被视为单个标记(与索引中的单个标记完全匹配)。
反斜杠用于转义文本中的"。
因此,整个 Lucene 查询变为:
title:"music for the masses" AND artist:"depeche mode" AND (format:"7\" vinyl" OR format:"10\" vinyl" OR format:"12\" vinyl")
并且当添加到 URL 中时,它变成了这样:
https://musicbrainz.org/ws/2/release?query=title:"music for the masses" AND artist:"depeche mode" AND (format:"7\" vinyl" OR format:"10\" vinyl" OR format:"12\" vinyl")&fmt=json
我将以上内容粘贴到浏览器查询栏中,我在 JSON 响应中返回了 8 个发布对象。
当 URL 被 URL 编码时,它最终如下:
https://musicbrainz.org/ws/2/release?query=title:%22music%20for%20the%20masses%22%20AND%20artist:%22depeche%20mode%22%20AND%20(format:%227\%22%20vinyl%22%20OR%20format:%2210\%22%20vinyl%22%20OR%20format:%2212\%22%20vinyl%22)&fmt=json
我在开头提到因此有可能格式字段(可能还有其他几个)被索引为字符串字段。我不知道这是事实 - 但这是我可以解释为什么我的查询有效而您的查询无效的唯一方法。所以我认为这是一个合理的假设——但我可能是错的。