Solr 6.6.2分组查询

gan*_*ers 5 grouping solr

在Solr 6.6.2上进行以下设置:

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

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

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

例如:

+----+-----------+--------------+
| ID | ContactId |  Properties  |
+----+-----------+--------------+
|  1 | C1        | Blue,Green   |
|  2 | C1        | Blue,Yellow  |
|  3 | C2        | Green,Yellow |
+----+-----------+--------------+
Run Code Online (Sandbox Code Playgroud)

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

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

group=true&group.field=ContactId&group.query=(Green AND Yellow)&q=(Green OR Yellow)
Run Code Online (Sandbox Code Playgroud)

我遵循的想法是查询(q)获取所有具有绿色或黄色的文档,而不是组中的分组.字段ContactId,然后是具有AND条件绿色和黄色的group.query.但那并没有成功.

在mySql中,只需要一个

group_concat(Properties) as grouped 
Run Code Online (Sandbox Code Playgroud)

并对该字符串执行类似操作:

grouped LIKE '%Green%' AND grouped LIKE '%Yellow%'
Run Code Online (Sandbox Code Playgroud)

如何在Solr索引上实现此查询?

到目前为止尝试引用和没有:

intersect(  
    search(w3, q=Properties:("Green"), fl="ContactId", sort="ContactId asc"),  
    search(w3, q=Properties:("Yellow"), fl="ContactId", sort="ContactId asc"),  
    on="ContactId" )
Run Code Online (Sandbox Code Playgroud)

派生自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" )
Run Code Online (Sandbox Code Playgroud)

但仍然只有结果出现在两个属性都位于同一文档内而不是那些属于同一个ContactId的多个文档中的每个属性的情况下(在这种情况下只有C2,但不是C1).

Mat*_*ndh 1

您可以通过使用Streaming Expression并获取两个查询之间的交集中包含的文档(即一个查询 matches Yellow,一个 matches Green)来完成此操作:

intersect(
  search(collection, q=Properties:Yellow, fl="ContactId", sort="ContactId asc"),
  search(collection, q=Properties:Green, fl="ContactId", sort="ContactId asc"),
  on="ContactId"
)
Run Code Online (Sandbox Code Playgroud)

expr您通过参数向请求处理程序提供流表达式/streamexpr=您还可以在 Solr 管理界面中的“Stream”下直接(不使用 )测试您的集合。

除此之外,您的 MySQL 示例实际上不会执行相同的操作,因为它会包含任何在某处存在文本的元素 - 因此“深绿色”会给出误报。