【问题标题】:Solr - how to "group by" and "limit"?Solr - 如何“分组”和“限制”?
【发布时间】:2011-05-17 04:58:46
【问题描述】:

假设我从我的数据库中索引了以下内容:

======================================
| Id |  Code | Description           |
======================================
| 1  | A1    | Hello world           |
| 2  | A1    | Hello world 123       |
| 3  | A1    | World hello hi        |
| 4  | B1    | Quick fox jumped      |
| 5  | B1    | Lazy dog              |
...

进一步,假设用户搜索“hello”,它应该返回记录 1、2 和 3。有没有办法让 Solr “分组”Code 字段并应用限制(比如 10 条记录)?我有点在寻找 GROUP BY 和 LIMIT 的 SQL 对应物。

此外,当它执行此“分组依据”时,我希望它选择最相关的文档并使用该文档的 Description 字段作为返回的一部分。

当然,我可以让 Solr 将所有内容返回到我的应用程序,然后我可以操纵结果来执行 GROUP BY 和 LIMIT。如果可能,我宁愿不这样做。

【问题讨论】:

    标签: indexing lucene solr full-text-search


    【解决方案1】:

    实现您想要的最简单的方法是使用 Solr 分组功能,也称为字段折叠。您必须在查询中添加以下参数:

    • group=true - 这将打开分组模块
    • group.field=Code - 这将告诉 Solr 应该在哪个字段上进行分组
    • rows=10 - 这会告诉 Solr 将唯一组的数量限制为最多 10 个

    如果您想在组中分页,您应该使用rowsstart 参数。要控制组内的结果,您可以使用group.limitgroup.offset

    希望对你有帮助:)

    【讨论】:

      【解决方案2】:

      将以下字段添加到您的查询中

      • '组':'真',
      • 'group.field':'source',
      • 'group.main':'true',
      • 'group.limit':10,

      【讨论】:

        【解决方案3】:

        http://XXX.XXX.XXX.XXX:8080/solr/autocomplete/select?q=displayterm:new&wt=json&indent=true&q.op=and&fl=displayterm&group=true&group.field=displayterm&rows=3&start=0

        注意:

        回应: 开始 - >响应开始你的身份证。 rows -> 你怎么看行数。

        Exp 
         1 step 
          &start=0&rows=3
        2 step 
          &start=3&rows=3
        3 step
          &start=6&rows=3
        etc.
        
        
        {
          "responseHeader":{
            "status":0,
            "QTime":1,
            "params":{
              "fl":"displayterm",
              "indent":"true",
              "start":"0",
              "q":"displayterm:new",
              "q.op":"and",
              "group.field":"displayterm",
              "group":"true",
              "wt":"json",
              "rows":"3"}},
          "grouped":{
            "displayterm":{
              "matches":231,
              "groups":[{
                  "groupValue":null,
                  "doclist":{"numFound":220,"start":0,"docs":[
                      {
                        "displayterm":"Professional News"}]
                  }},
                {
                  "groupValue":"general",
                  "doclist":{"numFound":1,"start":0,"docs":[
                      {
                        "displayterm":"General News"}]
                  }},
                {
                  "groupValue":"delhi",
                  "doclist":{"numFound":2,"start":0,"docs":[
                      {
                        "displayterm":"New Delhi"}]
                  }}]}}}
        

        【讨论】:

          【解决方案4】:

          看看field collapsing,在 Solr 4.0 中可用。根据相关性对组进行排序:group.sort=score desc

          【讨论】:

          • Solr v3.3+ 也提供此功能
          • @Karl Johansson 如何使用 django haystack 来完成?喜欢searchQuerySet().models(Product).group('field:"title"')
          • 这在 Solr 的参考资料中也有解释:cwiki.apache.org/confluence/display/solr/…
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-12-19
          • 1970-01-01
          • 2011-05-21
          • 2015-06-14
          • 1970-01-01
          相关资源
          最近更新 更多