elasticsearch ngram замедляется при совпадении большого количества документов

Я реализую функцию поиска по мере ввода в следующем примере: Edge NGram с сопоставлением фраз .

Я чувствую, что время запроса связано с количеством соответствующих документов, хотя я запрашиваю только 5 лучших документов.

В моем индексе 320 миллионов документов. Когда мой запрос равен «l», 6 миллионов документов соответствуют запросу, и для выполнения запроса требуется 22 мс. Однако, когда мой запрос «а», 133 миллиона документов соответствуют запросу, и это занимает 400 мс. Опять же, я прошу только 5 лучших документов.

См. ниже определение моего индекса и запрос.

Я пытаюсь сделать все мои запросы менее 100 мс. Как мне этого добиться? Что мне не хватает?

Вот мое определение индекса:

`

PUT /ss
{
    "settings": {
        "analysis": {
            "filter": {
                "english_poss_stemmer": {
                    "type": "stemmer",
                    "name": "possessive_english"
                },
                "edge_ngram": {
                    "type": "edgeNGram",
                    "min_gram": "1",
                    "max_gram": "25",
                    "token_chars": [
                        "letter",
                        "digit"
                    ]
                }
            },
            "analyzer": {
                "edge_ngram_analyzer": {
                    "filter": [
                        "lowercase",
                        "english_poss_stemmer",
                        "edge_ngram"
                    ],
                    "tokenizer": "standard"
                },
                "my_standard": {
                    "filter": [
                        "lowercase",
                        "english_poss_stemmer"
                    ],
                    "tokenizer": "standard"
                }
            }
        }
    },
    "mappings": {
        "ss": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "name": {
                    "search_analyzer": "my_standard",
                    "analyzer": "edge_ngram_analyzer",
                    "type": "text"
                },
                "type": {
                    "search_analyzer": "keyword",
                    "analyzer": "keyword",
                    "type": "text"
                },
                "tax_id": {
                    "search_analyzer": "keyword",
                    "analyzer": "keyword",
                    "type": "text"
                }
            }
        }
    }
}

`

Вот мой запрос:

GET /ss/_search
    {
            "from": 0,
            "size": 5,
            "query": {
                "bool": {
                    "must": {
                        "match_all": {}
                    },
                    "filter": {
                        "match_phrase": {
                            "name": "a"
                        }
                    }
                }
            }
        }

person user3268403    schedule 22.11.2017    source источник


Ответы (1)


Я не вижу никаких точек в грамме 1, и я думаю, что имеет смысл ограничить ваши граммы, скажем, 6.

У тебя есть:

"min_gram": "1"
"max_gram": "25"

Лучше иметь:

"min_gram": "2"
"max_gram": "6"
person Yuri Steps    schedule 22.10.2018