【问题标题】:Solr 6.6.2 Grouped QuerySolr 6.6.2 分组查询
【发布时间】:2018-05-08 16:12:15
【问题描述】:

在 Solr 6.6.2 上进行以下设置:

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

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

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

例如:

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

现在我需要查找属性具有“绿色”和“黄色”的所有 ContactId,其中允许此查询匹配此 ContactID 的所有文档。所以在这种情况下,结果将是 C1,C2。

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

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

我遵循的想法是 query(q) 用于获取所有具有绿色或黄色的文档,而不是在 group.field ContactId 上进行分组,然后是 group.query 与绿色和黄色的 AND 条件。 但这并没有成功。

在 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)。

【问题讨论】:

  • 您需要使用现有的数据模型吗?那么您是否无法加入索引时间?
  • 不,我无法更改

标签: solr grouping


【解决方案1】:

您可以通过使用Streaming Expression 并在两个查询之间获取文档contained in the intersection 来做到这一点(即一个查询匹配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"
)

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

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

【讨论】:

  • 我尝试了这种方法,但它没有提供正确的结果。看起来,交集是根据返回的文档完成的,这些文档在 C1、Doc1 为绿色和 Doc2 为黄色方面是不同的。但我需要返回文档的属性 ContactID 上的交集,而不是文档本身。
  • 交集应该在on给交集运算符的字段上进行;您按此字段排序很重要,因为这就是交集运算符将如何知道前进到任一流上的下一个文档的方式。您是否有一个失败的示例,以及表达式的结果?
  • 我也是这么想的,但结果不同。我尝试了您的方法以及从示例中得出的结果。
  • 你有例子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多