在Elasticsearch中,如何将规范化器与嵌套对象结合在一起?

时间:2019-03-05 04:36:21

标签: elasticsearch

从总体上讲,我的用例需要一个嵌套对象,并且我还想对嵌套对象执行不区分大小写的精确匹配。

我从这里的示例开始:

https://www.codementor.io/mehuljain/case-insensitive-exact-matches-in-elasticsearch-nny7ii7fw

除了不使用嵌套对象外,它几乎完全符合我的要求。

我试图通过将类型从text更改为nested来修改上一页中的代码:

PUT titles
{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "filter": ["lowercase"]
        }
      }
    }
  },
  "mappings": {
    "default": {
      "properties": {
        "title": {
          "type": "nested",
          "fields": {
            "normalize": {
              "type": "keyword",
              "normalizer": "my_normalizer"
            },
            "keyword" : {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

但是,这不起作用,并且我收到一条错误消息。

如何在Elastic中的嵌套对象上执行不区分大小写的精确匹配搜索?

1 个答案:

答案 0 :(得分:1)

由于要处理嵌套对象,因此需要定义其properties而不是fields

{
  "settings": {
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "default": {
      "properties": {
        "title": {
          "type": "nested",
          "properties": {                       <----------- should be properties and not fields
            "normalize": {
              "type": "keyword",
              "normalizer": "my_normalizer"
            },
            "keyword": {
              "type": "keyword"
            }
          }
        }
      }
    }
  }
}

基于上述更改,title将是和反对normalizekeyword这两个属性。