# Медленный unified highlighting

**URL:** <https://discuss.elastic.co/t/unified-highlighting/205653>\
**Category:** Вопросы на русском языке\
**Created:** [October 29, 2019, 11:34am UTC](https://discuss.elastic.co/t/unified-highlighting/205653 "2019-10-29T11:34:46Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 29, 2019, 11:34am UTC](https://discuss.elastic.co/t/unified-highlighting/205653/1 "2019-10-29T11:34:47Z")

</div>

День добрый!

Очень медленно работает unified highlighting если в analizer используется hunspell filter.  
Я понимаю, что многое зависит от словаря... но в моей проблеме задерживается подсветка, а не поиск. Причем очень сильно. Судя по докам надо добавить "index\_options:offsets" - но эффекта нет.

Делаю простой опыт - один индекс и один документ с "Войной и миром".  
Аналайзер примерно такой:

```auto
            "body_analyzer_with_hunspell" : {
              "filter" : [
                "word_delimiter_russian",
                "lowercase",
                "stop_words",
                "protected_words",
                "english_hunspell",
                "russian_hunspell",
                "synonym"
              ],
              "type" : "custom",
              "tokenizer" : "standard"
            },

```

Просто поиск работает 5 мсек.  
Добавляю подсветку к индексу с offsets - 57 СЕКУНД!  
Убираю из аналайзера хунспел - 400-800 мсек.  
Делаю с term\_vector - 300-600мсек.

fvh c term\_vector - 100-200 мсек.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 29, 2019, 1:09pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/2 "2019-10-29T13:09:51Z")

</div>

Сколько записей вы получаете? Можно в эти 57 секунд запустить [hot\_threads](https://www.elastic.co/guide/en/elasticsearch/reference/current/cluster-nodes-hot-threads.html) несколько раз и прислать сюда результат?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 29, 2019, 2:01pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/3 "2019-10-29T14:01:01Z")

</div>

Получаю одну запись. Последовательно четыре слова из текста, чтобы нашлось.  
Место практически не влияет (начало или конец документа).  
Логи через 5 секунд:  
[https://drive.google.com/drive/folders/1tLbnDPlTMRAvHj-izXPiKyyVJJ5NOIEB?usp=sharing](https://drive.google.com/drive/folders/1tLbnDPlTMRAvHj-izXPiKyyVJJ5NOIEB?usp=sharing)

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 29, 2019, 2:03pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/4 "2019-10-29T14:03:30Z")

</div>

И какого размера эта запись?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 29, 2019, 3:22pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/5 "2019-10-29T15:22:26Z")

</div>

4 слова "прижизненных публикаций текстов Толстого"

```auto
{
  "took": 60322,
  "timed_out": false,
  "_shards": {
    "total": 2,
    "successful": 2,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 6.1971927,
    "hits": [
      {
        "_index": "inddoc-1976-10",
        "_type": "searchtype",
        "_id": "pAtOB24Bv-T1AayOjhIh",
        "_score": 6.1971927,
        "inner_hits": {
          "body2": {
            "hits": {
              "total": 1,
              "max_score": 6.1971927,
              "hits": [
                {
                  "_index": "inddoc-1976-10",
                  "_type": "searchtype",
                  "_id": "pAtOB24Bv-T1AayOjhIh",
                  "_nested": {
                    "field": "body2",
                    "offset": 0
                  },
                  "_score": 6.1971927,
                  "highlight": {
                    "body2.txt": [
                      "Пунктуация <em>прижизненных</em> <em>публикаций</em> <em>текстов</em> <em>Толстого</em>, как в большинстве случаев отражающая традицию не"
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

```

Запрос:

```auto
q={
  "from": 0, 
  "_source": False,
  "profile":False,
  "size": 1000, 
  "query": {
      "nested": { 

          "inner_hits":{ 
              "_source":False, 
              "highlight" : { 
                  "order":"score", 
                  "number_of_fragments":1,
                  "type":"unified", 
                  #"type":"fvh", 
                  "fields":{ "body2*":{ } 
                      } 
                  }, 
              }, 

          "path": "body2", 
          "score_mode": "sum", 
          "query": { "match": {"body2.txt": {"boost": 3.0, "minimum_should_match": "75%", "prefix_length": 3, "fuzziness": 1, "query": query}}}
          }
      }
  }

```

P.S. без nested примерно тоже самое.  
Сам документ рядом в гугл-драйв положил. Правда там "плоский" вариант. Но там nested не nested невлияет, главное чтобы маппинг совпал.

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 29, 2019, 7:01pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/6 "2019-10-29T19:01:44Z")

</div>

Ну так с этого и надо было начинать, что вы "Войну и Мир" целиком проиндексировали. 😃 У вас там, "Людей доброй воли" Жюль Ромена в базе, случайно нет?

А если поискать только слово `корректор`, то сколько времени занимает?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 29, 2019, 7:42pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/7 "2019-10-29T19:42:07Z")

</div>

Дык вчего 6мб. 3,5млн знаков. Какой нибудь отчет за пару лет может и больше весить. И "корректор" ищется так же:

```auto
{
  "took": 52125,
  "timed_out": false,
  "_shards": {
    "total": 2,
    "successful": 2,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 0.920828,
    "hits": [
      {
        "_index": "inddoc-1976-10",
        "_type": "searchtype",
        "_id": "pAtOB24Bv-T1AayOjhIh",
        "_score": 0.920828,
        "inner_hits": {
          "body2": {
            "hits": {
              "total": 1,
              "max_score": 0.920828,
              "hits": [
                {
                  "_index": "inddoc-1976-10",
                  "_type": "searchtype",
                  "_id": "pAtOB24Bv-T1AayOjhIh",
                  "_nested": {
                    "field": "body2",
                    "offset": 0
                  },
                  "_score": 0.920828,
                  "highlight": {
                    "body2.txt": [
                      "публикаций текстов Толстого, как в большинстве случаев отражающая традицию не автора, а типографии или <em>корректора</em>"
                    ]
                  }
                }
              ]
            }
          }
        }
      }
    ]
  }
}

```

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 29, 2019, 7:43pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/8 "2019-10-29T19:43:48Z")

</div>

Это с offsets или без?

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 29, 2019, 7:47pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/9 "2019-10-29T19:47:20Z")

</div>

Да.

```auto
    "mappings": {
      "searchtype": {
        "properties": {
          "body2": {
            "type": "nested",
            "dynamic": "strict",
            "properties": {
              "txt": {
                "type": "text",
                "index_options": "offsets",
                "fields": {
                  "original": {
                    "type": "text",
                    "index_options": "offsets",
                    "analyzer": "body_analyzer_original"
                  }
                },
                "analyzer": "body_analyzer_with_hunspell",
                "search_analyzer": "search_analyzer"
              }
            }
          },
....

```

Запрос в точности, как выше - только по "body2.txt"

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 29, 2019, 9:31pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/10 "2019-10-29T21:31:22Z")

</div>

Я открыл [https://github.com/elastic/elasticsearch/issues/48660](https://github.com/elastic/elasticsearch/issues/48660)

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 30, 2019, 6:09am UTC](https://discuss.elastic.co/t/unified-highlighting/205653/11 "2019-10-30T06:09:33Z")

</div>

Да. на самом деле без fuzziness отрабатывает за 250мсек.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 30, 2019, 12:55pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/12 "2019-10-30T12:55:21Z")

</div>

Насколько понял объяснения Jim Ferenczi это не баг, это фича. 🙂  
Что при нечетком поиске хайлайтер должен анализировать документ по новой, т.к. неможет взять смещения из index\_options.

> <https://github.com/elastic/elasticsearch/issues/48660#issuecomment-547839307>
>
> A user reported on our discuss forum that turning on fuzziness in match queries prevents the unified highlighter from using postings....

Но я не понял, почему это не мешает FVH c temp\_vector.  
Или я что-то понял совсем не так?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 30, 2019, 2:19pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/13 "2019-10-30T14:19:45Z")

</div>

> [@GreenX](#):
>
> Но я не понял, почему это не мешает FVH c temp\_vector.  
> Или я что-то понял совсем не так?

Хороший вопрос. Я обсудил это еще раз с Джимом. В случае, когда fuzziness включена, термин в поиске может быть "развернут" в большое количество похожих терминов. В случае с FVH у нас есть маленький словарь терминов для каждого поля, поэтому все эти термины можно найти очень быстро. В случае с постингами, у нас только один большой словарь на все документы, и нахождение всех терминов в нем может занять много времени. Поэтому в случае с fuzziness мы не используем постинги, но используем векторы, если они имеются.

---

<div class="post-metadata">

**Author:** ![Mikhail\_Khludnev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mikhail_khludnev/32/59591_2.png) [@Mikhail\_Khludnev](https://discuss.elastic.co/u/Mikhail_Khludnev)\
**Post date:** [October 30, 2019, 2:21pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/14 "2019-10-30T14:21:41Z")

</div>

Всё так. Постинг хайлайтеру нужны термы, вхождения которых он и подсветит в документе. В простом случае термы берутся из запроса, но в случае мультитермов \*,~ нужно будет перебрать все возможные термы под \* вычитать постинги для них и проверит вхождение документа. Что очень долго.  
Терм вектор это прямая (не отбратная) структура данных, те из неё можно вычитать только те термы которые входят в документ и другие похожие по fuzzy не перебирать.

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 30, 2019, 6:21pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/15 "2019-10-30T18:21:54Z")

</div>

Не... что то не срастается.

Вот читаю про [term\_vector](https://www.elastic.co/guide/en/elasticsearch/reference/current/term-vector.html). Содержит список термов, позиции и смещения "букв" (не знаю как по русски)

Читаю про [index\_options](https://www.elastic.co/guide/en/elasticsearch/reference/7.4/index-options.html). Содежит тоже самое плюс количество документов, частоты термов....

в чём ключевая разница?

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 30, 2019, 6:35pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/16 "2019-10-30T18:35:36Z")

</div>

> [@GreenX](#):
>
> в чём ключевая разница?

Размер этого списка.

> [@Igor\_Motov](#):
>
> В случае с FVH у нас есть маленький словарь терминов для каждого поля... В случае с постингами, у нас только один большой словарь на все документы,

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 30, 2019, 6:41pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/17 "2019-10-30T18:41:16Z")

</div>

Но ведь index\_options мы ставим на конкретное поле и как в этом случае попадает терм с нечетким соответвием не понятно.

---

<div class="post-metadata">

**Author:** ![Mikhail\_Khludnev](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/mikhail_khludnev/32/59591_2.png) [@Mikhail\_Khludnev](https://discuss.elastic.co/u/Mikhail_Khludnev)\
**Post date:** [October 30, 2019, 6:44pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/18 "2019-10-30T18:44:00Z")

</div>

https://www.slideshare.net/slideshow/embed_code/key/l9rCk9WFJ8ANCk  
slide 18  
 ![image](https://us1.discourse-cdn.com/elastic/original/3X/8/c/8c5d2f3a9c41ee129b81acfd82f3c760215e12c6.jpeg)

---

<div class="post-metadata">

**Author:** ![Igor\_Motov](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/igor_motov/32/45193_2.png) [@Igor\_Motov](https://discuss.elastic.co/u/Igor_Motov)\
**Post date:** [October 30, 2019, 6:48pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/19 "2019-10-30T18:48:11Z")

</div>

Я думаю, что @Mikhail_Khludnev хотел этим сказать, что в случае с векторами у вас в списке будут только слова из Войны и Мира. В постингах у вас будут еще слова из Анны Карениной, Братьев Карамазовых, и т.д. 😃

---

<div class="post-metadata">

**Author:** ![GreenX](https://sea2.discourse-cdn.com/elastic/user_avatar/discuss.elastic.co/greenx/32/51751_2.png) [@GreenX](https://discuss.elastic.co/u/GreenX)\
**Post date:** [October 30, 2019, 6:54pm UTC](https://discuss.elastic.co/t/unified-highlighting/205653/20 "2019-10-30T18:54:41Z")

</div>

Ну с объемами то ладно, примерно понятно.  
Сейчас найду нормальную ссылку на презентацию почитаю. А то ведь в нас умудрились забанить даже слайдшаре... х.з. кому он помешал... видимо терррористы схемы в паверпоинте друг-другу пересылают, или наркоты лунный календарь посева конопли публикуют.

[Next page](https://discuss.elastic.co/t/unified-highlighting/205653.md?page=2)
