Elasticsearch 索引逗号分隔值并将它们用作过滤器

Elasticsearch index comma-separated values and use them as filters

我目前正在使用以下配置将 element 字段索引为 "element" : "dog,cat,mouse"

ES 配置:

"settings": {
    "analysis": {
        "analyzer": {
            "search_synonyms": {
                "tokenizer": "whitespace",
                "filter": [
                    "graph_synonyms",
                    "lowercase",
                    "asciifolding"
                ],
            },
            "comma" : {
                "type" : "custom",
                "tokenizer" : "comma"
            }
        },
        "filter": {
            "graph_synonyms": {
                ...
            }
        },
        "normalizer": {
            "normalizer_1": {
                ...
            }
        },
        "tokenizer" : {
            "comma" : {
                "type" : "pattern",
                "pattern" : ","
            }
        },
    }
},

字段映射:

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

dog,cat,mouse 之后用作过滤器,但我想将它们分开并将每个值用作单独的过滤器。我尝试使用 multi-fields 功能并进行了以下更改,但我仍然不确定我还应该做什么。

"element": {
    "type": "keyword",
    "normalizer": "normalizer_1",
    "fields": {
        "separated": {
            "type": "text",
            "analyzer": "comma"
        }
    }
},

如果我理解正确,您有一个字段,您将值存储为 dog,cat,mouse 并且您需要单独使用它们,例如 dogcatmouse你可以简单地使用文本字段来存储它们,它使用 default standard analyzer,它在逗号 , 上拆分标记。

analyze API 显示令牌

{
    "text": "dog,cat,mouse",
    "analyzer": "standard"
}

生成的令牌

{
    "tokens": [
        {
            "token": "dog",
            "start_offset": 0,
            "end_offset": 3,
            "type": "<ALPHANUM>",
            "position": 0
        },
        {
            "token": "cat",
            "start_offset": 4,
            "end_offset": 7,
            "type": "<ALPHANUM>",
            "position": 1
        },
        {
            "token": "mouse",
            "start_offset": 8,
            "end_offset": 13,
            "type": "<ALPHANUM>",
            "position": 2
        }
    ]
}

根据评论,添加一个关于如何定义 element 字段以便使用 standard 分析器的示例,注意当前它被定义为 keyword 和规范器,因此 standard 未使用分析器。

索引映射

PUT /你的索引/

{
  "mappings": {
    "properties": {
      "name": { 
        "element": "text"
        }
      }
    }
  }