规范器编辑

规范器类似于分析器,但它们只能发出单个标记。因此,它们没有分词器,并且只接受可用字符过滤器和标记过滤器的子集。只有基于每个字符的过滤器才允许。例如,允许小写过滤器,但不允许词干提取过滤器,因为词干提取过滤器需要查看整个关键字。可以在规范器定义中使用的过滤器当前列表为:arabic_normalizationasciifoldingbengali_normalizationcjk_widthdecimal_digitelisiongerman_normalizationhindi_normalizationindic_normalizationlowercasepattern_replacepersian_normalizationscandinavian_foldingserbian_normalizationsorani_normalizationtrimuppercase

Elasticsearch 附带一个 lowercase 内置规范器。对于其他形式的规范化,需要自定义配置。

自定义规范器编辑

自定义规范器接受一个 字符过滤器 列表和一个 标记过滤器 列表。

response = client.indices.create(
  index: 'index',
  body: {
    settings: {
      analysis: {
        char_filter: {
          quote: {
            type: 'mapping',
            mappings: [
              '« => "',
              '» => "'
            ]
          }
        },
        normalizer: {
          my_normalizer: {
            type: 'custom',
            char_filter: [
              'quote'
            ],
            filter: [
              'lowercase',
              'asciifolding'
            ]
          }
        }
      }
    },
    mappings: {
      properties: {
        foo: {
          type: 'keyword',
          normalizer: 'my_normalizer'
        }
      }
    }
  }
)
puts response
PUT index
{
  "settings": {
    "analysis": {
      "char_filter": {
        "quote": {
          "type": "mapping",
          "mappings": [
            "« => \"",
            "» => \""
          ]
        }
      },
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": ["quote"],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "foo": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      }
    }
  }
}