首页 > 解决方案 > 在 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 中的嵌套对象执行不区分大小写的精确匹配搜索?

标签: elasticsearch

解决方案


由于您正在处理嵌套对象,因此您需要定义它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


推荐阅读