如何在Elasticsearch中的查询或过滤器中指定或定位特定文档类型的字段?

时间:2016-04-28 10:04:05

标签: elasticsearch

假设:

  1. 两种不同类型的文档,比如说“产品”和“类别”,都会被索引到同一个Elasticsearch索引。
  2. 两种文档类型都有一个字段'tags'。
  3. 问题:

    我想构建一个返回两种类型结果的查询,但是'product'类型的文档允许标记'X'和'Y',而'category'类型的文档只允许有标记'Z'。我怎样才能做到这一点?看来我不能使用product.tags和category.tags,因为ES会查找文档的产品/类别字段,这不是我想要的。

    注意:

    虽然上面的例子可能有某种解决方法,但我正在寻找一种在编写查询时定位或指定特定文档类型字段的通用方法。我基本上想要“命名”我的查询中使用的字段名称,因此只考虑我想要使用的类型的文档。

1 个答案:

答案 0 :(得分:1)

我认为现场别名对你来说是最好的答案,但这是不可能的。 相反,您可以使用“copy_to”但我可能会影响索引大小:

DELETE /test
PUT /test
{
      "mappings": {
          "product" : {
              "properties": { 
                "tags": { "type": "string", "copy_to": "ptags" },
                "ptags": { "type": "string" }
            }
            },
          "category" : {
              "properties": { 
                "tags": { "type": "string", "copy_to": "ctags" },
                "ctags": { "type": "string" }
            }
        }
    }
}

PUT /test/product/1
{ "tags":"X" }
PUT /test/product/2
{ "tags":"Y" }
PUT /test/category/1
{ "tags":"Z" }

您可以查询其中一个字段或其中许多字段:

GET /test/product,category/_search
{
    "query": {
        "term": {
           "ptags": {
              "value": "x"
           }
        }
    }
}

GET /test/product,category/_search
{
    "query": {
        "multi_match": {
        "query":      "x",
        "fields":     [ "ctags", "ptags" ]
        }
    }
}