Elasticsearch 术语聚合和小写值

Elasticsearch terms aggregation and lowercase values

我正在使用以下搜索查询根据用户键入的内容填充自动完成下拉列表中的值。

{
    _source: 'event',
    query: {
        simple_query_string: {
            query: ''+term+'*', // converts to string; adds * to match prefix
            fields: ['event'] 
        }
    },
    size:0,
    track_total_hits: false,
    aggs: {
        filterValues: {
            composite: {
                size: 100,
                sources: [
                    { "filterValue": { "terms": { "field": 'event', "missing_bucket": true } } }
                ],
                after: { 'event': after }
            },
        }
    }
}

用于索引的字段值:UYB 4.9.0 AJF 5 Qnihsbm.

目前,如果用户键入第一个字母 uU,Elasticsearch 将 return 上述值小写 uyb 4.9.0 ajf 5 qnihsbm。我怎样才能保持这种行为,但 return 的值与索引时的值完全一样?即 UYB 4.9.0 AJF 5 Qnihsbm

字段映射

"mappings": {
    "properties": {
        "event": {
            "type": "keyword",
            "normalizer": "normalizer_1"
        },
        .....
    }
}

ES 配置

"settings": {
    "analysis": {
        "normalizer": {
            "normalizer_1": {
                "type": "custom",
                "char_filter": [],
                "filter": ["lowercase", "asciifolding"]
            }
        }
    }
},

如果您启用了 _source,那么您可以使用 source filtering 来检索索引值。

https://www.elastic.co/guide/en/elasticsearch/reference/current/mapping-source-field.html 有关 _source 字段及其用例的更多信息。

您的映射中应该有另一个不是小写的字段,这就是您要搜索的字段。

"mappings": {
    "properties": {
        "event": {
            "type": "keyword",
            "fields": {
                "search": {
                    "type": "keyword",
                    "normalizer": "normalizer_1",
                }
            }
        },
        .....
    }
}

然后您的查询将需要在 event.search 上 运行 而不是“事件”

    simple_query_string: {
        query: ''+term+'*', // converts to string; adds * to match prefix
        fields: ['event.search'] 
    }                      ^
                           |
                       add this

其余的都可以保持不变。