Solr - 如何“分组”和“限制”?

时间:2010-11-29 10:15:43

标签: indexing lucene solr full-text-search

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

======================================
| 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。如果可能的话,我宁愿不这样做。

4 个答案:

答案 0 :(得分:12)

查看Solr 4.0中提供的field collapsing。对相关性组进行排序:group.sort=score desc

答案 1 :(得分:0)

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

注意:

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

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"}]
          }}]}}}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

如果您想分页浏览,请使用rowsstart参数。要控制组内部的结果,您可以使用group.limitgroup.offset

希望这会有所帮助:)