在ElasticSearch中创建与条件组合的聚合

9cbw7uwe  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(1)|浏览(154)

给定下面的ElasticSearch文档:

{
    "_id": "3330481",
    "_type": "user",
    "_source": {
        "id": "3330481",
        "project": "Cool_Project_One"
    }
}

我正在构建一个UI组件,它将根据用户的文本输入自动向用户建议“project”字段中的所有值

例如:

当用户键入“Cool”时,我想向他显示“project”字段中以“Cool”开头的所有值

我已经创建了此聚合:

"aggs": {
    "projects": {
        "terms": {
            "field": "project",
            "size": 2
        }
    }
}

它返回一个包含项目字段所有值的列表,但我不明白如何只查找与特定表达式匹配的值。
我发现this answer显示了如何添加过滤器,但似乎过滤器只返回完全匹配,因为我试图这样做:

{
    "aggs": {
        "projects": {
            "filter": {
                "term": {
                    "project": "Cool"
                }
            },
            "aggs": {
                "terms": {
                    "field": "project",
                    "size": 2
                }
            }
        }
    }
}

但没有成功。
任何帮助都将不胜感激

gajydyqb

gajydyqb1#

一些注意事项:
1.术语查询将寻找精确匹配(包括大小写,如果你想要更灵活的东西,你可以使用常规的“匹配”查询
1.一般情况下,您要在查询中添加筛选器,而不是聚合
1.您可以使用聚合按类别类型字段进行分组,但也可以使用常规查询与标题类型字段进行匹配
我建议使用一个建议字段类型,也可以捕获前缀(项目por示例中的proj)。
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-as-you-type.html
我刚刚看到您定义了_type,所以您可能使用的是旧版本的Elasticsearch,而search_as_you_type相对较新。我将添加一些同时包含query和aggs的示例:

“按类型搜索”、“文本”和“关键字”字段的Map:

PUT test_suggestions  
{
  "mappings": {
    "properties": {
      "project": {
        "type": "text",
        "fields": {
          "suggestions": {
            "type": "search_as_you_type"
          },
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

正在索引文档

POST test_suggestions/_doc
{
  "project": "Cool Project"
}

search_as_you_type查询,支持现成的前缀:

GET test_suggestions/_search
{
  "query": {
    "multi_match": {
      "query": "coo",
      "type": "bool_prefix",
      "fields": [
        "project",
        "project._2gram",
        "project._3gram"
      ]
    }
  },
  "aggs": {
    "project_categories": {
      "terms": {
        "field": "project.keyword",
        "size": 10
      }
    }
  }
}

常规查询,不区分大小写,您可以只写字段的一部分,并且将工作

GET test_suggestions/_search
{
  "query": {
    "match": {
      "project": "Cool"
    }
  },
  "aggs": {
    "project_categories": {
      "terms": {
        "field": "project.keyword",
        "size": 10
      }
    }
  }
}

额外的好处:前缀搜索没有search_as_you_type或设置ngrams:

GET test_suggestions/_search
{
  "query": {
    "match_phrase_prefix": {
      "project": "coo"
    }
  },
  "aggs": {
    "project_categories": {
      "terms": {
        "field": "project.keyword",
        "size": 10
      }
    }
  }
}

相关问题