Как хранить то, что сгенерировано анализатором?

Допустим, я использую это отображение:

PUT test
{
  "settings" : {
    "index" : {
        "number_of_shards" : 1, 
        "number_of_replicas" : 0
    }
  },
  "mappings": {
    "testtype": {
      "properties": {
        "content": {
          "type":     "text",
          "analyzer": "english",
          "store": true
        }
      }
    }
  }
}

Теперь я могу проиндексировать документ:

PUT test/testtype/0
{
   "content": "The Quick Brown Box"
}

И я могу получить его:

GET test/testtype/0

Что вернет меня:

{
  "_index": "test",
  "_type": "testtype",
  "_id": "0",
  "_version": 1,
  "found": true,
  "_source": {
    "content": "The Quick brown Fox"
  }
}

Я знаю, что в исходном поле у ​​вас должен быть только тот документ, который вы вставили, поэтому я указал в своем сопоставлении, что хочу сохранить свое поле содержимого. Таким образом, запрашивая поле моего хранилища, я ожидаю, что в нем будет то, что сгенерировано моим анализатором, так что-то вроде этого:

"quick brown fox"

Но когда я запрашиваю сохраненное поле:

GET test/testtype/_search
{
  "stored_fields": "content" 
}

У меня есть именно то, что я написал в своем документе:

{
  "took": 1,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "test",
        "_type": "testtype",
        "_id": "0",
        "_score": 1,
        "fields": {
          "content": [
            "The Quick brown Fox"
          ]
        }
      }
    ]
  }
}

Итак, мой вопрос: как я могу сохранить в своем эластичном поиске результат того, что сгенерировано моим анализатором?


person mel    schedule 29.08.2017    source источник


Ответы (2)


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

Сохраненное поле содержит то же самое, что и соответствующее поле в "_source"-JSON.

Сгенерированный токен находится во внутреннем представлении Lucene. Но вы можете использовать _analyze или < конечная точка href="https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-termvectors.html" rel="nofollow noreferrer">_termvectors для просмотра токена или можно использовать агрегацию терминов

person Karsten R.    schedule 29.08.2017

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

Дополнительные сведения: https://www.elastic.co/guide/en/elasticsearch/reference/current/analyzer.html

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

Дополнительные сведения: https://www.elastic.co/guide/en/elasticsearch/reference/current/multi-fields.html

person Ansaldos    schedule 29.08.2017
comment
Я прочитал ссылку, которую вы предоставили, но для меня это просто хранение одних и тех же вещей, но проанализированных с помощью другой методологии, и я не могу получить доступ к тому, что произвел анализатор. Не могли бы вы привести пример? - person mel; 29.08.2017
comment
По умолчанию значения полей индексируются, чтобы сделать их доступными для поиска, но не сохраняются. Это означает, что поле может быть запрошено, но исходное значение поля не может быть получено. Это отсюда: elastic.co/guide/en/ elasticsearch/reference/current/ Проверьте также эту ссылку, и после этого я могу предоставить вам образец, если это необходимо. Установите для «магазина» значение true. - person Ansaldos; 29.08.2017
comment
Я уже установил в своем сопоставлении, что хранилище должно быть истинным, но, похоже, оно не работает. - person mel; 29.08.2017