# Suggest API и Spark

**URL:** <https://discuss.elastic.co/t/suggest-api-spark/52427>\
**Category:** Вопросы на русском языке\
**Created:** [June 10, 2016, 9:06am UTC](https://discuss.elastic.co/t/suggest-api-spark/52427 "2016-06-10T09:06:03Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 10, 2016, 9:06am UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/1 "2016-06-10T09:06:03Z")

</div>

Для целей автозаполнения хочу применить [Suggest API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters.html) (конфигурировал исходя из [статьи](https://qbox.io/blog/quick-and-dirty-autocomplete-with-elasticsearch-completion-suggest)).

Сейчас встал вопрос, как это дело подружить с загрузкой данных Sparkом.  
Код загрузки элементарен:

> JavaRDD\<Map\<String, Object\>\> resultRdd = inputRdd.map(line -\> {  
> if (line.trim().isEmpty()) {  
> return null;  
> }  
> String arr = line.split("\t");  
> ObjectMapper mapper = new ObjectMapper();  
> @SuppressWarnings("unchecked")  
> Map\<String, Object\> map = mapper.readValue(arr[1], Map.class);  
> map.put(esMappingId, arr[0]);  
> return map;  
> }).filter(x -\> x != null);

Проблема в том, что я не пойму, как можно передать данные (пробую на примере простого числового айди) в поле с suggest типом.

Если просто добавляю в мапу map.put("SUGGEST\_ID", arr[0]); , маппинг у индекса меняется (создается отдельный тип и ко всему содержимому добавляется обычное поле SUGGEST\_ID).

Если добавляю SUGGEST\_ID в виде мапы с input-полем и айди внутри (

```
Map<String, String> map2 = new HashMap<>();
map2.put("input", arr[0]);
map.put("SUGGEST_ID", map2);

```

)  
происходит тоже самое - создается новый тип.

Создаю индекс в таком виде:

```
{
  "test_2": {
    "aliases": {},
    "mappings": {
      "doc": {
        "properties": {
          "ID": {
            "type": "string"
          },
          "suggest_ID": {
            "search_analyzer": "simple",
            "type": "completion",
            "payloads": "false",
            "analyzer": "simple"
          },
          "test-id": {
            "type": "string"
          }
        }
      }
    },
    "settings": {
      "index": {
        "number_of_shards": "5",
        "number_of_replicas": "1"
      }
    },
    "warmers": {}
  }
}

```

а после спарка имею что то следующее:

```
{
  "test_2": {
    "aliases": {},
    "mappings": {
      "doc": {
        "properties": {
          "ID": {
            "type": "string"
          }, 
          "suggest_ID": {
            "properties": {
              "completion": {
                "properties": {
                  "field": {
                    "type": "string"
                  },
                  "size": {
                    "type": "long"
                  }
                }
              },
              "input": {
                "type": "string"
              },
              "text": {
                "type": "string"
              }
            }
          } 
        }
      }
    },
    "settings": {
      "index": {
        "test_2": {
          "settings": {
            "index": {
              "number_of_shards": "5",
              "number_of_replicas": "1"
            }
          },
          "mappings": {
            "doc": {
              "properties": {

                "suggest_ID": {
                  "search_analyzer": "simple",
                  "type": "completion",
                  "payloads": "false",
                  "analyzer": "simple"
                } ,
                "ID": {
                  "type": "string"
                }
              }
            }
          }
        },
        "creation_date": "1465489137103",
        "number_of_shards": "5",
        "number_of_replicas": "1",
        "uuid": "zD-HR3pgRsK0Mvyj4IIuuA",
        "version": {
          "created": "2030299"
        }
      }
    },
    "warmers": {}
  }
}

```

Вопрос - как можно загрузить данные также и в suggest-поле?  
Или же оставить эту затею и воспользоваться советом того же товарища из [ответа](http://stackoverflow.com/questions/28312421/completion-suggester-in-elasticsearch-on-existing-field)

---

<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:** [June 10, 2016, 3:21pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/2 "2016-06-10T15:21:00Z")

</div>

Проблема в том, как вы создаете индекс. Похоже, что вы и установки и маппинг засунули в установки каким-то образом

```auto

  "test_2": {
    "aliases": {},
    "mappings": {
      "doc": {
.... поля добавленные elasticsearch динамически ....
      }
    },
    "settings": {
      "index": {
       // ваши установки должны появится тут без имени индекса 
        "test_2": {
         // все внутри "test_2": {...} игнорируется потому что elasticsearch понятия не имеет
         // что такое index.test_2.settings.index.number_of_shards, например
          "settings": {
            "index": {
              "number_of_shards": "5",
              "number_of_replicas": "1"
            }
          },
          // этот меппинг тоже игнорируется, потому что elasticsearch рассматривает его, как
          // неизвестный параметр установок
          "mappings": {
            "doc": {
              "properties": {

```

---

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 10, 2016, 4:22pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/3 "2016-06-10T16:22:44Z")

</div>

Спасибо, разобрался.

Мало того, что неправильный JSON был, так ещё и в head его неправильно запихивал...

---

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 10, 2016, 4:35pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/4 "2016-06-10T16:35:23Z")

</div>

Да, кстати, возник вопрос - а можно ли использовать suggest для численных данных?

---

<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:** [June 10, 2016, 4:42pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/5 "2016-06-10T16:42:40Z")

</div>

> а можно ли использовать suggest для численных данных?

Как вы себе это представляете? Не могли бы вы привести пример?

---

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 10, 2016, 5:52pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/6 "2016-06-10T17:52:54Z")

</div>

Ну, например, поиск Java-вского BigInteger-а..

---

<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:** [June 10, 2016, 5:56pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/7 "2016-06-10T17:56:54Z")

</div>

> Ну, например, поиск Java-вского BigInteger-а..

То есть, я набираю 123, и elasticsearch предлагет 123456789012334, 1234, 1234555? Так как-то?

---

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 10, 2016, 7:28pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/8 "2016-06-10T19:28:48Z")

</div>

Примерно.. На самом деле мне интересны большие числа, по 10-15 знаков.

---

<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:** [June 11, 2016, 12:11am UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/9 "2016-06-11T00:11:34Z")

</div>

> Примерно.. На самом деле мне интересны большие числа, по 10-15 знаков.

Я вот что пытаюсь понять, Вам эти числа интересны именно как числа с точки зрения suggest, или они по функциональности просто слова с 10-15 символами, в которых все символы, по какой-то причине, являются цифрами.

---

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 15, 2016, 7:37am UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/10 "2016-06-15T07:37:47Z")

</div>

Да, они интересны именно как слова.

При этом тип самой колонки я явно указываю как string

---

<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:** [June 18, 2016, 12:00am UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/11 "2016-06-18T00:00:12Z")

</div>

Для suggest все равно из каких знаков ваши слова состоят. Так что можно использовать точно так же, как и для слов.

---

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 22, 2016, 11:31am UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/12 "2016-06-22T11:31:38Z")

</div>

Нашел причину всех своих бед.

Оказалось, что если необходимо использовать suggest для чисел, то нужно менять анализатор.  
simple для этих целей не подходит. В доках lucene об этом прямо так и сказано:

> ```
> /** An {@link Analyzer} that filters {@link LetterTokenizer} 
> * with {@link LowerCaseFilter} 
> **/
> public final class SimpleAnalyzer extends Analyzer {
> 
> ```

Поменял анализатор на whitespace и получил желаемое поведение. Более правильного анализатора не нашел (ну, точнее нашел NumericIntegerAnalyzer, но не нашел его имени для указания в jsonе при создании).

---

<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:** [June 22, 2016, 10:44pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/13 "2016-06-22T22:44:45Z")

</div>

Да, `simple` просто все не-буквы выкидывает. У Вас цифры эти пробелами разделены или просто в тексте случайным образом упоминаются? Если второе, то лучше воспользоваться `standard`, он кроме разделения по пробелам еще и знаки препинания правильно обрабатывает.

---

<div class="post-metadata">

**Author:** ![Evgeny\_Lazarev](https://avatars.discourse-cdn.com/v4/letter/e/d07c76/32.png) [@Evgeny\_Lazarev](https://discuss.elastic.co/u/Evgeny_Lazarev)\
**Post date:** [June 23, 2016, 8:00am UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/14 "2016-06-23T08:00:20Z")

</div>

У меня и первое, и второе есть. Так что буду смотреть и тестировать.

Спасибо большое за подсказки.

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/elastic/original/3X/1/a/1ac57faf039f6b580b3f104ef42a2a89e41014de.png) [@system](https://discuss.elastic.co/u/system)\
**Post date:** [July 6, 2017, 1:47pm UTC](https://discuss.elastic.co/t/suggest-api-spark/52427/15 "2017-07-06T13:47:34Z")

</div>

Closed on July 6, 2017, 1:47pm UTC


