Solr 6.6.2分组查询

时间:2017-11-24 16:06:28

标签: solr grouping

在Solr 6.6.2上进行以下设置:

Solr云集合,其文档具有字段ID,ContactId,属性启动和运行以及id上的唯一键。

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

每个联系人文档都有一个包含一行文本的文本字段属性。属性字段用','分隔索引,例如,属性:绿色命中。

例如:

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

现在我需要查找所有ContactIds,其中Properties具有“Green”和“Yellow”,允许此查询匹配此ContactID的所有文档。因此,结果将是C1,C2。

我尝试对结果进行分组,但仍然无法查询分组结果。

group=true&group.field=ContactId&group.query=(Green AND Yellow)&q=(Green OR Yellow)

我遵循的想法是查询(q)获取绿色或黄色的所有文档,而不是group.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)。

1 个答案:

答案 0 :(得分:1)

您可以使用Streaming Expression并在两个查询之间提取文档contained in the intersection(即一个查询与Yellow匹配,一个匹配Green)来执行此操作:< / p>

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

您通过expr参数将流式表达式提供给/stream请求处理程序。您也可以在Solr管理界面的“Stream”下直接测试它(无expr=)。

除此之外,你的MySQL示例实际上不会做同样的事情,因为它包含任何在某处出现文本的元素 - 因此“深绿色”会产生误报。