Elasticsearch "max_ngram_diff" работает для "edge_ngram", но не для "ngram_tokenizer" - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть индекс Elasticsearch, в котором я установил "max_ngram_diff": 50, но почему-то он работает только для токенизатора edge_ngram, но не для токенизатора ngram.

I ' Мы сделали два запроса на один и тот же URL http://localhost:9201/index-name/_analyze:

Запрос 1

{
    "tokenizer":
    {
        "type": "edge_ngram",
        "min_gram": 3,
        "max_gram": 20,
        "token_chars": [
            "letter",
            "digit"
        ]
    },
    "text": "1234567890;abcdefghijklmn;"
}

Запрос 2

{
    "tokenizer": {
        "type": "ngram",
        "min_gram": 3,
        "max_gram": 20,
        "token_chars": [
            "letter",
            "digit"
        ]
    },
    "text": "1234567890;abcdefghijklmn;"
}

Первый запрос возвращает ожидаемый результат:

{
    "tokens": [
        {
            "token": "123",
            "start_offset": 0,
            "end_offset": 3,
            "type": "word",
            "position": 0
        },
        {
            "token": "1234",
            "start_offset": 0,
            "end_offset": 4,
            "type": "word",
            "position": 1
        },
        {
            "token": "12345",
            "start_offset": 0,
            "end_offset": 5,
            "type": "word",
            "position": 2
        },
        {
            "token": "123456",
            "start_offset": 0,
            "end_offset": 6,
            "type": "word",
            "position": 3
        }, 
        // more tokens
    ]
}

Но второй запрос только возвращает это:

{
    "error": {
        "root_cause": [
            {
                "type": "remote_transport_exception",
                "reason": "[ffe18f1a89e6][172.18.0.3:9300][indices:admin/analyze[s]]"
            }
        ],
        "type": "illegal_argument_exception",
        "reason": "The difference between max_gram and min_gram in NGram Tokenizer must be less than or equal to: [1] but was [17]. This limit can be set by changing the [index.max_ngram_diff] index level setting."
    },
    "status": 400
}

Что случилось, тот первый запрос с edge_ngram токенизатором может иметь большую разницу между max_gram и min_gram, чем 1, но второй запрос с токенизатором ngram не может?

Это мое отображение:

{
    "settings": {
        "index": {
            "max_ngram_diff": 50,
            // further settings
         }
     }
}

Используемая версия elastisearch: 7.2.0

Спасибо за помощь!

1 Ответ

0 голосов
/ 27 февраля 2020

Это поведение связано с версией ES 7.2.0. При использовании ES версии 7.4.0 все работает как положено.

...