如何过滤 Solr 中多值字段返回的值
How to filter values returned on a multivalued field in Solr
我有一个文档,其中包含一个名为 uuid 的字段。此字段是一个列表(多值),每个文档最多可包含 100k 个值。
例如,我想搜索匹配以“5ff6115e”开头的 uuid 的文档。我已经可以通过使用 q=uuids:5ff6115e*
:
成功地做到这一点
http://localhost:8983/solr/test1/select?q=uuids%3A5ff6115e*&rows=1&fl=uuids&wt=json&indent=true
但是,生成的文档为我带来了该字段的所有 100k 值。
我想要的不仅是过滤uuids字段以这个值开头的文档,还要过滤返回的字段值,这样我就只会在答案中收到特定的值。
怎么做?
这目前不可能;参见 this bug and this previous question。
我不知道你的索引有多大,但是拥有一个包含 100k 多值字段的文档对我来说似乎不是正确的方法。在这种情况下,与其在 solr 中请求功能,不如重构索引并以其他方式存储信息,也许创建另一个核心,其中包含文档,每个文档都具有文档的唯一 ID 和带有 guid 的字段。您可以使用 then field collapsing 或其他 solr 功能来获取您需要的信息。
因此,例如,在 solr 中的一个简单案例是对书籍进行索引,而不是将每本书作为一个整体进行索引,最好将每个单独的页面作为一个文档进行索引。如果你能告诉我们更多关于你的案例的信息,我们可以考虑如何改进索引。
无论如何,对于没有那么多值的情况,您可以使用突出显示组件获得相同的结果。为了获得最佳性能,您可以排除 return 字段列表中的字段,并使用荧光笔 return 匹配的术语。您可以调整荧光笔以获得最大数量的片段以及每个片段有多大等。
http://localhost:8893/solr/test1/select?q=uuids%3A5ff6115e*&rows=1&fl=id&wt=json&indent=true&hl=on&hl.fragsize=1&hl.fl=uuids
使用突出显示。 @Jokin 首先提到它,我觉得这是最好的答案,无需破解 Solr。尝试使用 PostingsHighlighter 或 FastVectorHighlighter,而不是 default/standard 荧光笔。不幸的是,他们都在内部对该字段中的所有 UIDS 执行通配符查询。 FVH 在内部有机会 可以更聪明地处理这一点,但它并没有以这种方式实施。
注意:如果写一点 Java 以添加到 Solr 的范围内,理想的答案是添加术语向量(只是术语向量中的术语数据,没有 offsets/positions) 然后写一个"DocTransformer" 来抓取词向量词;寻找前缀,然后迭代具有该前缀的那些。相当快。
我有一个文档,其中包含一个名为 uuid 的字段。此字段是一个列表(多值),每个文档最多可包含 100k 个值。
例如,我想搜索匹配以“5ff6115e”开头的 uuid 的文档。我已经可以通过使用 q=uuids:5ff6115e*
:
http://localhost:8983/solr/test1/select?q=uuids%3A5ff6115e*&rows=1&fl=uuids&wt=json&indent=true
但是,生成的文档为我带来了该字段的所有 100k 值。
我想要的不仅是过滤uuids字段以这个值开头的文档,还要过滤返回的字段值,这样我就只会在答案中收到特定的值。
怎么做?
这目前不可能;参见 this bug and this previous question。
我不知道你的索引有多大,但是拥有一个包含 100k 多值字段的文档对我来说似乎不是正确的方法。在这种情况下,与其在 solr 中请求功能,不如重构索引并以其他方式存储信息,也许创建另一个核心,其中包含文档,每个文档都具有文档的唯一 ID 和带有 guid 的字段。您可以使用 then field collapsing 或其他 solr 功能来获取您需要的信息。
因此,例如,在 solr 中的一个简单案例是对书籍进行索引,而不是将每本书作为一个整体进行索引,最好将每个单独的页面作为一个文档进行索引。如果你能告诉我们更多关于你的案例的信息,我们可以考虑如何改进索引。
无论如何,对于没有那么多值的情况,您可以使用突出显示组件获得相同的结果。为了获得最佳性能,您可以排除 return 字段列表中的字段,并使用荧光笔 return 匹配的术语。您可以调整荧光笔以获得最大数量的片段以及每个片段有多大等。 http://localhost:8893/solr/test1/select?q=uuids%3A5ff6115e*&rows=1&fl=id&wt=json&indent=true&hl=on&hl.fragsize=1&hl.fl=uuids
使用突出显示。 @Jokin 首先提到它,我觉得这是最好的答案,无需破解 Solr。尝试使用 PostingsHighlighter 或 FastVectorHighlighter,而不是 default/standard 荧光笔。不幸的是,他们都在内部对该字段中的所有 UIDS 执行通配符查询。 FVH 在内部有机会 可以更聪明地处理这一点,但它并没有以这种方式实施。
注意:如果写一点 Java 以添加到 Solr 的范围内,理想的答案是添加术语向量(只是术语向量中的术语数据,没有 offsets/positions) 然后写一个"DocTransformer" 来抓取词向量词;寻找前缀,然后迭代具有该前缀的那些。相当快。