#elasticsearch
#elasticsearch
Вопрос:
Я пытаюсь лучше понять внутренности ElasticSearch, поэтому я хотел бы знать, есть ли какие-либо различия в том, как ElasticSearch внутренне вычисляет статистику терминов для следующих двух случаев.
Первый случай — это когда у меня есть такие документы, как:
{
"foo": [
{
"bar": "long string"
},
{
"bar": "another long string"
}
]
}
Или документ, подобный:
{
"foobar": "long string another long string"
}
Я понимаю, что первый документ сводится к:
{
"foo.bar": ["long string", "another long string"]
}
Итак, кажется, вопрос в том, действительно ли второй и третий документы индексируются одинаково? Вычисляется ли статистика терминов одинаково?
Ответ №1:
Интересный вопрос! Если вы проиндексируете первый и второй документ, а затем посмотрите на векторы терминов для foo.bar
поля, вы заметите, что частоты и смещения точно такие же, однако позиции различаются.
Причина этого связана с position_increment_gap
параметром, значение которого по умолчанию равно 100. Причина, по которой вводится этот ложный пробел, заключается в том, чтобы предотвратить совпадение запросов фраз по значениям.
Итак, в первом документе foo.bar
поле имеет несколько значений, как вы правильно заметили, поэтому позиции терминов отличаются от второго документа, где есть только одна строка.
["long string", "another long string"]
Это означает, что если вы попытаетесь использовать match_phrase
запрос для сопоставления string another
, то он не будет соответствовать первому документу, только второму.
Вы все равно можете изменить значение position_increment_gap
в сопоставлении первого документа и установить его равным 0, и в этом случае оба документа будут проиндексированы точно так же.
Комментарии:
1. Неплохо. Я не знал, что вы можете получить векторы терминов. Очень полезно. Спасибо.
2. Потрясающе, рад, что это помогло!