在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)。
答案 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示例实际上不会做同样的事情,因为它包含任何在某处出现文本的元素 - 因此“深绿色”会产生误报。