在Elasticsearch中按嵌套对象字段值过滤

时间:2018-09-27 21:00:21

标签: elasticsearch

我想按嵌套字段值过滤文档。我的文档就是这样,我想按Color参数对其进行过滤:

{
  "_index": "myindex",
  "_type": "product",
  "_id": "984984",
  "_source": {
    "id": "98418",
    "name": "Product1",
    ..
    "parameters": {
      "Color": [
        "Black",
        "Gold"
      ]
    }
  }
}

我的映射是:

{
  "myindex": {
    "mappings": {
      "product": {
        "properties": {
          ..
          "parameters": {
            "type": "nested",
            "properties": {
            "Color": {
              "type": "text",
              "fields": {
                "keyword": {
                  "type": "keyword",
                  "ignore_above": 256
                }
              }
            },
            ..
          }
        }
      }
    }
  }
}

我的过滤器查询如下:

{
  "query": {
    "bool": {
      "filter": {
        "nested": {
          "path": "parameters",
          "query": {
            "term": {    
              "parameters.Color":"Gold"
            }
          }  
        }
      }
    }
  }
}

但是不幸的是我收到的文件为零,我不明白为什么?

谢谢

编辑

正在运行的事件:

{
  "query": {
    "nested": {
      "path": "parameters",
      "query": {
        "bool": {
          "must": [
            { "match": { "parameters.Color": "Gold" }}
          ]
        }
      }
    }
  }
}

..但这不是:

{
  "query": {
    "nested": {
      "path": "parameters",
      "query": {
        "bool": {
          "filter": [
            { "term": { "parameters.Color": "Gold" }}
          ]
        }
      }
    }
  }
}

为什么?

1 个答案:

答案 0 :(得分:1)

您的term查询正在寻找完全匹配的内容,并且在搜索之前先对match查询进行分析。如果您使用标准分析仪,它将在分析术语时将其小写。

如果需要进行完全匹配,则可以使用关键字字段。

{
  "query": {
    "bool": {
      "filter": {
        "nested": {
          "path": "parameters",
          "query": {
            "term": {    
              "parameters.Color.keyword":"Gold"
            }
          }  
        }
      }
    }
  }
}