Solr 6.6.2 分组查询

5

在Solr 6.6.2上拥有以下设置:

一个Solr云集合,其中文档具有ID、ContactId、Properties字段,并且唯一键为id。

可以存在多个具有相同ContactId的文档。

每个联系人文档都有一个文本字段属性,包含一行文本。属性字段使用逗号分隔进行索引,例如:Properties:Green hits。

例如:

+----+-----------+--------------+
| ID | ContactId |  Properties  |
+----+-----------+--------------+
|  1 | C1        | Blue,Green   |
|  2 | C1        | Blue,Yellow  |
|  3 | C2        | Green,Yellow |
+----+-----------+--------------+

现在我需要查找所有属性为“Green”和“Yellow”的联系人ID,允许此查询匹配该联系人ID的所有文档。因此,在这种情况下,结果将为C1,C2。
我尝试对结果进行分组,但仍然无法在分组结果上进行查询。
group=true&group.field=ContactId&group.query=(Green AND Yellow)&q=(Green OR Yellow)

我遵循的想法是查询(q)以获取所有既有绿色又有黄色的文档,然后按组.field ContactId进行分组,然后使用绿色和黄色的AND条件进行group.query。但这并没有成功。
在MySQL中,只需执行以下操作:
group_concat(Properties) as grouped 

并对该字符串执行类似操作:
grouped LIKE '%Green%' AND grouped LIKE '%Yellow%'

我应该如何在Solr索引上执行此查询?

已经尝试过建议使用引号和不使用引号:

intersect(  
    search(w3, q=Properties:("Green"), fl="ContactId", sort="ContactId asc"),  
    search(w3, q=Properties:("Yellow"), fl="ContactId", sort="ContactId asc"),  
    on="ContactId" )

源自Solr交集示例:

intersect(  
    search(w3, q=Properties:("Green" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"),  
    search(w3, q=Properties:("Yellow" OR "Green" AND "Yellow"), fl="ContactId", sort="ContactId asc"),  
    on="ContactId" )

但是搜索结果仅显示两个属性在同一文档内的情况,而不是它们分别在同一ContactId下的多个文档中(此时仅显示C2,而不是C1)。


你需要使用现有的数据模型吗?这意味着你是否可以进行索引时间连接? - Mysterion
不,我无法更改它。 - gantners
1个回答

1
你可以通过使用流式表达式并获取两个查询之间的交集中所包含的文档来实现此目标(即一个查询匹配Yellow,另一个查询匹配Green):
intersect(
  search(collection, q=Properties:Yellow, fl="ContactId", sort="ContactId asc"),
  search(collection, q=Properties:Green, fl="ContactId", sort="ContactId asc"),
  on="ContactId"
)

你可以通过/stream请求处理程序中的expr参数提供流表达式。您还可以在Solr管理界面下的“Stream”中直接测试它(不带expr=)以针对您的收集进行测试。
除此之外,您的MySQL示例并不能完全相同,因为它会包括任何具有文本出现的元素 - 因此,“Dark Green”将会产生错误的结果。

我尝试了那种方法,但它并没有提供正确的结果。似乎交集是基于返回的文档进行的,这些文档在C1方面是不同的,绿色文档为Doc1,黄色文档为Doc2。但是我需要的是在返回的文档的ContactID属性上进行交集,而不是文档本身。 - gantners
交集应该在on中给定的字段上执行,以进行交集运算符; 重要的是您还要按此字段排序,因为这就是交集运算符将知道如何继续进入任一流的下一个文档的方式。您有一个示例,在该示例中失败,并显示表达式的结果吗? - MatsLindh
这也是我想的,但结果却不同。我尝试了你的方法以及从示例中推导出来的方法。 - gantners
你有例子吗? - MatsLindh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接