Внутренности массива строк против конкатенированной строки в ElasticSearch

#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. Потрясающе, рад, что это помогло!