我有一个名为uuids的文档。该字段是一个列表(多值),每个文档最多可以有100k值。
我想搜索匹配以“5ff6115e”开头的uuids的文档。我已经可以使用q=uuids:5ff6115e*
:
http://localhost:8983/solr/test1/select?q=uuids%3A5ff6115e *&安培;行= 1&安培; FL = UUID的&安培;重量= JSON&安培;缩进=真
但是,结果文档为我带来了该字段的所有100k值。
我想要的不仅是过滤uuids字段以此值开头的文档,还要过滤返回的字段值,以便我只接收答案中的特定值。
怎么做?
答案 0 :(得分:2)
使用突出显示。 @Jokin首先提到它,我觉得这是最好的答案,不会攻击Solr。尝试使用PostingsHighlighter或FastVectorHighlighter,而不是默认/标准荧光笔。不幸的是,它们都在内部对该字段中的所有UIDS执行通配符查询。 FVH内部的机会更聪明,但没有这样实现。
注意:如果在写入一个小的Java添加到Solr的范围内,理想的答案是添加术语向量(只是术语向量中的术语数据,没有偏移/位置)然后写一个“DocTransformer” “抓住术语矢量术语;寻找前缀,然后迭代那些有前缀的人。相当快速。
答案 1 :(得分:1)
目前无法做到这一点;请参阅this bug和this previous question。
答案 2 :(得分:1)
我不知道你的索引有多大,但拥有一个包含10万个多值字段的文档对我来说似乎并不合适。在这种情况下,不是在solr中要求使用某个功能,而是以其他方式重构索引并存储信息更好,也许创建另一个核心,其中包含文档的唯一文档和带有guid的字段。您可以使用then field collapsing或其他solr功能来获取所需的信息。
因此,例如,solr中的一个简单案例是索引书籍,而不是将每本书作为一个整体索引,最好将每个单独的页面索引为文档。如果你能告诉我们更多关于你的案例,我们可以考虑如何改进索引。
无论如何,对于没有这么多值的情况,您可以使用突出显示组件获得相同的结果。为获得最佳性能,您可以在返回字段列表中排除该字段,并使用突出显示器返回匹配的字词。您可以调整荧光笔以获得最大数量的片段以及每个片段的大小等。 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