Elasticsearch индексирует значения, разделенные запятыми, и использует их в качестве фильтров - PullRequest
1 голос
/ 26 мая 2020

В настоящее время я индексирую поле element как "element" : "dog,cat,mouse" со следующей конфигурацией:

ES config :

"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 впоследствии используется как фильтр, но я хочу разделить их и использовать каждое значение как отдельный фильтр. Я попытался использовать функцию с несколькими полями и внес следующие изменения, но я все еще не уверен, что мне еще делать.

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

1 Ответ

1 голос
/ 26 мая 2020

Если я правильно понимаю, у вас есть поле, в котором вы храните значение как dog,cat,mouse, и они вам нужны отдельно, например dog, cat и mouse, для этого вы можете просто использовать текстовое поле для хранения им, который использует стандартный анализатор , который разделяет токены на запятую ,.

анализируйте 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 / your-index /

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