【问题标题】:ElasticSearch: How to Match all fields in Mapping TypeElasticSearch:如何匹配映射类型中的所有字段
【发布时间】:2021-08-27 16:39:17
【问题描述】:

问题 我正在尝试编写一个匹配映射类型(MyFirstMappingType)的所有属性的 ElasticSearch 查询。如果一个属性不匹配,则不应返回该项目。他们不应该混合匹配来获得匹配。

映射

  "mappings": {
    "item": { 
      "_all":       { "enabled": "false"  },
      "properties": { 
        "MyFirstMappingType": {
          "properties": {
            "field1":  { "type": "keyword" },
            "field2":  { "type": "keyword" }, 
            "field3":  { "type": "text", "index": "false" }
          }
        }
      }
    }
  }

当项目与这些字段中的每一个匹配时,此查询将返回项目。但是当一个项目有多个“MyFirstMappingType”时,它会混合搭配。例如,这个查询仍然会返回这个项目。

GET myfirst/item/_search
{
  "from": 0,
  "size": 38,
  "_source": [
    "MyFirstMappingType"
  ],
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "field1": "foo"
          }
        },
        {
          "term": {
            "field2": "bar"
          }
        },
        {
          "term": {
            "field3": "world"
          }
        }
        }
      ]
    }
  }
          "MyFirstMappingType" : [
            {
              "field1" : "foo",
              "field2" : "bar",
              "field3" : "hello"
            },
            {
              "field1" : "foo",
              "field2" : "world",
              "field3" : "foo"
            },
            {
              "field1" : "foo",
              "field2" : "foo",
              "field3" : "world"
            }
          ]

【问题讨论】:

    标签: elasticsearch kibana elasticsearch-query


    【解决方案1】:

    要独立查询每个array对象,您需要将MyFirstMappingType定义为nested type

    添加一个带有索引映射和搜索查询的工作示例

    索引映射:

    {
      "mappings": {
        "properties": {
          "MyFirstMappingType": {
            "type": "nested"
          }
        }
      }
    }
    

    搜索查询:

    {
      "query": {
        "nested": {
          "path": "MyFirstMappingType",
          "query": {
            "bool": {
              "filter": [
                {
                  "term": {
                    "MyFirstMappingType.field1": "foo"
                  }
                },
                {
                  "term": {
                    "MyFirstMappingType.field2": "bar"
                  }
                },
                {
                  "term": {
                    "MyFirstMappingType.field3": "world"
                  }
                }
              ]
            }
          }
        }
      }
    }
    

    【讨论】:

    • @OneThumbs 请仔细阅读答案,如果这能解决您的问题,请告诉我
    • 很遗憾,我无法更改索引的映射。如果将其设为“嵌套”类型是唯一的解决方案,那么我可能就不走运了。但是为了找到解决方案,我仍然会尝试确定它是否返回所需的结果。谢谢!
    • @OneThumbs AFAIK 除了使用嵌套类型来实现所需的结果之外,别无他法。如果这个解决方案对你有用,请告诉我;-)
    • @OneThumbs 你试过nested 数据类型吗?
    • 是的!这如所描述的那样工作。感谢您的帮助。
    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2017-07-28
    • 2015-10-19
    • 1970-01-01
    相关资源
    最近更新 更多