Как использовать эластичный поиск для хранения и извлечения документа в формате Json

#json #elasticsearch

#json #elasticsearch

Вопрос:

Я работаю над ElasticSearch с целью хранения и извлечения данных в формате json. Проблема в том, что ES обрабатывает json как текст / строку, когда я использую функцию поиска / выделения, и не выполняет мое требование, то есть получить все родительские файлы сохраненного json в результате поиска. Например, если у меня есть json, подобный этому:

{"jsonfile.htm":{"Headingtag":"100129","Sectiontext":{"part i":{"Headingtag":"p1","Sectiontext":{"Random Heading I":{"Sectiontext":"Impossible considered invitation him men instrument saw celebrated unpleasant."},"Random Heading II":{"Sectiontext":"Prevailed discovery immediate objection of ye at."}}}}}}

Когда мы используем функцию поиска или выделения для «знаменитого» текста, это дает мне результат, подобный этому:

[выделить] => Массив ( [подробно] => Array ( [0] => «:{» Случайный заголовок I»:{«Sectiontext»:»Невозможно считать приглашение его мужчин, инструмент видел, как праздновали ) )

Он рассматривает json как строку и игнорирует отношение родитель-потомок. Кто-нибудь может помочь мне узнать, как получить все искомые текстовые родительские элементы в результате?

Комментарии:

1. Извините за мой первый пост. Что вы хотите, так это иметь древовидный вид от корня до поля, подобного: Sectiontext.часть i.Sectiontext.Случайный заголовок I.Sectiontext»: «Невозможно считать приглашение, которое ему, как инструменту, отметили, неприятным». ?

2. @Jaycreation да, у меня это сработает. Я просто хочу получить все родительские элементы искомого текста.

Ответ №1:

Вероятно, вам следует просто использовать возможность использовать * в «выделить». Если я возьму ваш пример:

 GET my-index/_search
{
  "query": {
    "multi_match": {
      "query": "celebrated",
      "fields": ["jsonfile.*"]
    }
  },
  "highlight": {
    "fields": {
      "jsonfile.*": {}
    }
  }
}
  

И результатом будет:

 {
        "_index" : "test-5",
        "_type" : "_doc",
        "_id" : "r4fdAXQBw1rncBcgXr08",
        "_score" : 0.2876821,
        "_source" : {
          "jsonfile.htm" : {
            "Headingtag" : "100129",
            "Sectiontext" : {
              "part i" : {
                "Headingtag" : "p1",
                "Sectiontext" : {
                  "Random Heading I" : {
                    "Sectiontext" : "Impossible considered invitation him men instrument saw celebrated unpleasant."
                  },
                  "Random Heading II" : {
                    "Sectiontext" : "Prevailed discovery immediate objection of ye at."
                  }
                }
              }
            }
          }
        },
        "highlight" : {
          "jsonfile.htm.Sectiontext.part i.Sectiontext.Random Heading I.Sectiontext" : [
            "Impossible considered invitation him men instrument saw <em>celebrated</em> unpleasant."
          ]
        }
      }
  

Конечно, вы также можете отключить _source в своем запросе, если вы не используете is.

Комментарии:

1. Это работает, но полезно только тогда, когда мы проиндексировали только данные json. Есть ли какой-либо способ сохранить другую информацию, такую как document_id, document_type и т.д., Вместе с данными json?

2. Да, я думаю, это был ваш вариант использования. Что касается других данных, если они есть в вашем исходном поле, вам нужно будет найти их здесь. вы должны добавить их в свой документ во время загрузки.