elasticsearch 如何在ES中搜索聚合?,elasticsearch,elasticsearch" /> elasticsearch 如何在ES中搜索聚合?,elasticsearch,elasticsearch" />

elasticsearch 如何在ES中搜索聚合?

elasticsearch 如何在ES中搜索聚合?,elasticsearch,elasticsearch,我有一个图书索引,其中包含一系列标签(包括文本/关键字类型),我想为标签提供一个自动完成功能,以便用户键入“ro”并返回“Roman”或“rock and roll” 以下是我的映射: /books { ... tags: { type: 'text', field: { keyword: {type: 'keyword'} } } } 范例书 { name: "foo", tags: ['romance', 'story', 'fiction']

我有一个图书索引,其中包含一系列标签(包括文本/关键字类型),我想为标签提供一个自动完成功能,以便用户键入“ro”并返回“Roman”或“rock and roll”

以下是我的映射:

/books {
 ...
  tags: {
    type: 'text',
    field: {
      keyword: {type: 'keyword'}
    }
  }
}
范例书

{ name: "foo", tags: ['romance', 'story', 'fiction'] }
我的标签聚合:

      {
      size: 0,
      aggregations: {
        options: {
          terms: {
            field: `tags.keyword`,
            size: 20
          }
        }
      }
我如何才能只获取与“ro”匹配的所有不同标记?

只需尝试:

GET book/_search
{
  "query": {
    "prefix": {
      "tags.keyword": "ro"
    }
  }, "size": 0,
  "aggs": {
    "options": {
      "terms": {
        "field": "tags.keyword",
        "size": 20
      }
    }
  }
}
但对于您的用例,我建议您使用ngram过滤器构建一个自定义分析器,如下所示:

    "tags": {
      "type": "text",
      "analyzer": "english_custom",
      "fields": {
        "suggester": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        },
        "keyword":{
                   "type": "keyword" }
      } 
 {"filter":{
     ....

    "autocomplete_filter": {
      "type": "edge_ngram",
      "min_gram": 2,
      "max_gram": 8
    }
  },
  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "autocomplete_filter"
      ]
    } 
   }
自动完成分析器应如下所示:

    "tags": {
      "type": "text",
      "analyzer": "english_custom",
      "fields": {
        "suggester": {
          "type": "text",
          "analyzer": "autocomplete",
          "search_analyzer": "standard"
        },
        "keyword":{
                   "type": "keyword" }
      } 
 {"filter":{
     ....

    "autocomplete_filter": {
      "type": "edge_ngram",
      "min_gram": 2,
      "max_gram": 8
    }
  },
  "analyzer": {
    "autocomplete": {
      "type": "custom",
      "tokenizer": "standard",
      "filter": [
        "lowercase",
        "autocomplete_filter"
      ]
    } 
   }
编辑: 你能在术语聚合中使用include子句吗

GET /_search
{
    "aggs" : {
        "tags" : {
            "terms" : {
                "field" : "tags.keyword",
                "include" : "ro.*"
            }
        }
    }
}

你看过热门歌曲吗?我不确定这对这个案例会有什么帮助。我希望你能根据你的搜索查询为每个标签创建热门搜索聚合。所以,你的搜索会有一个顶级标签的列表。问题是我得到的其他标签不包含“ro”,但它们只是碰巧在有其他“ro”标签的相同文档中。我们能在上面使用bucket选择器聚合吗?这只在标记与“ro”匹配的文档上应用了一个过滤器,我仍然得到没有“ro”的兄弟标记。问题是我得到的其他标记不包含“ro”,但它们恰好位于具有其他“ro”标记的相同文档中,包括工作!!但是我如何使它不区分大小写,正则表达式似乎没有像/i这样的标志?@Ryan你现在不能,你应该在索引时以小写形式插入标记,或者为具有文本数据类型的字段向分析器添加小写过滤器,或者为具有关键字datatype的字段向规范化器添加小写。谢谢你的帮助!