Elasticsearch: лучше иметь больше значений или больше полей? - PullRequest
0 голосов
/ 09 октября 2018

Предположим, есть индекс с документами, описывающими транспортные средства.

Ваш индекс должен иметь дело с двумя различными типами транспортных средств: мотоцикл и автомобиль.

Какое из следующих сопоставлений лучше с точки зрения производительности?(вложенный требуется для моих целей)

    "vehicle": {
        "type": "nested",
        "properties": {
            "car": {
                "properties": {
                    "model": {
                        "type": "string"
                    },
                    "cost": {
                        "type": "integer"
                    }
                }
            },
            "motorcycle": {
                "properties": {
                    "model": {
                        "type": "string"
                    },
                    "cost": {
                        "type": "integer"
                    }
                }
            }
        }
    }

или этот:

"vehicle": {
    "type": "nested",
    "properties": {

        "model": {
            "type": "string"
        },
        "cost": {
            "type": "integer"
        },
        "vehicle_type": {
            "type": "string"     ### "car", "motorcycle"
        }

    }
}

Второй является более читабельным и тонким.

Но недостаток, который яУ меня будет то, что, когда я делаю свои запросы, если я хочу сосредоточиться только на «машине», мне нужно поместить это условие как часть запроса.

Если я использую первое отображение, мне просто нужноиметь прямой доступ к сохраненному полю, не добавляя накладных расходов к запросу.

1 Ответ

0 голосов
/ 10 октября 2018

Первое картирование, где автомобили и мотоциклы изолированы в разных областях, с большей вероятностью будет быстрее.Причина в том, что у вас есть на один фильтр меньше, чем вы уже знаете, и из-за повышенной избирательности запросов (например, меньше документов для данного значения vehicle.car.model, чем просто vehicle.model)

Другойможно создать два отдельных индекса car и motorcycle, возможно, с одним и тем же шаблоном индекса .

В Elasticsearch запрос обрабатывается одним потоком для каждого сегмента.Это означает, что если вы разделите свой индекс на два, а запросите оба в одном запросе , он будет выполнен параллельно.

Таким образом, при необходимости запросить только один из автомобилей или мотоциклов, это быстрее просто потому, что индексы меньше.И когда дело доходит до запросов как автомобилей, так и мотоциклов, это также может быть быстрее, если использовать больше потоков.

РЕДАКТИРОВАТЬ: один недостаток более поздней опции, о которой вы должны знать, внутренний словарь lucene будет продублирован, и если значения в автомобилях и мотоциклах совершенно идентичны, он удваивает список проиндексированных терминов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...