elasticsearch聚合中的第一个字母匹配

时间:2015-10-28 19:18:20

标签: ruby-on-rails elasticsearch

我正在将弹性搜索从使用构面迁移到使用聚合,我想创建一个查询,其中聚合表示以某个字母开头的所有创建者名称。

我已经创建了一个嵌套索引:

 indexes creators, type: 'nested' do
  indexes :name, type: 'string', analyzer: 'caseinsensitive', index: 'not_analyzed'
end

以下查询将返回创建者姓名以“b”开头的所有项目。到目前为止工作很棒。

      {
        "query": {
            "filtered": {
                "query": {"match_all": {}},
                "filter": {
                    "nested": {
                        "path": "creators",
                        "query": {
                            "prefix": {
                                "creators.name": {
                                    "value": "b"
                                }
                            }
                        }
                    }
                }
            }
        },
        "aggregations": {
          "creators": {
             "nested": {
                "path": "creators"
             },
             "aggs": {
                "name": {
                   "terms": {
                      "field": "creators.name",
                      "size": 100
                   }
                }
             }
          }
       }
    }

但是,查询的聚合部分返回结果的所有聚合,包括不以“b”开头的实例创建者名称。例如,如果我有一个包含两个创作者的项目:

           "creators": [
              {
                 "name": "Beyonce"
              },
              {
                 "name": "JayZ"
              }
           ],

聚合结果将包括JayZ和Beyonce。像大多数人一样,我只想要碧昂丝。

1 个答案:

答案 0 :(得分:3)

尝试此查询,看看情况如何:

{
  "query": {
    "filtered": {
      "query": {
        "match_all": {}
      },
      "filter": {
        "nested": {
          "path": "creators",
          "query": {
            "prefix": {
              "creators.name": {
                "value": "b"
              }
            }
          }
        }
      }
    }
  },
  "aggregations": {
    "creators": {
      "nested": {
        "path": "creators"
      },
      "aggs": {
        "NAME": {
          "filter": {
            "prefix": {
              "creators.name": "b"
            }
          },
          "aggs": {
            "name": {
              "terms": {
                "field": "creators.name",
                "size": 100
              }
            }
          }
        }
      }
    }
  }
}