Изучение ES-объектов и вложенных объектов (3)

Elasticsearch
Изучение ES-объектов и вложенных объектов (3)

Предыдущий отзыв

Последняя статья была написанаЗнакомство с ES — начало работы с Kibana (2), в принципе закончилElasticSearchиKibanaустановка и основные понятия. Сегодня поговорим о некоторых формальныхElasticSearchПроблемы, возникающие при использовании, и пути их решения.

введение

ElasticSearchкакNosqlбаза данных, одна из функций которой не поддерживается多表关联的. Итак, вElasticSearchДанные в反范式способ хранения. Проще говоря, он будет храниться как大的Json对象.

данные объекта вElasticSearchв качествеobjectтип хранения.Однако если данные объекта представляют собой массив, возникнет проблема, связанная с тем, что запрос не может быть связан с запросом.

Я не знаю, есть ли друзья, которые приходят в замешательство, когда видят это?

Если вы не знаете, в чем проблема, то посмотрите пример ниже.

Если вы знаете, что это значит, то посмотрите решение под примером.

объект

Возьмем пример системы блогов.

Предположим, мы хотимElasticSearchсоздатьblogпоказатель.blogУказатель включает следующее содержание.

  • title: название блога
  • содержание: содержание блога
  • комментарий: комментарий блога
  • comment.username: пользователь комментария в блоге
  • comment.content: содержание комментария в блоге.

Я не знаю, нашел ли это кто-нибудьблогиКомментарийЭто отношение «один ко многим», и неважно, если вы его не найдете, продолжайте смотреть ниже.

Согласно полям, разложенным выше, мы находимся вElasticSearchСоздайте следующий индекс.

PUT blog
{
  "mappings": {
    "_doc": {
      "properties": {
        "blog": {
          "properties": {
            "title": {
              "type": "keyword"
            },
            "content": {
              "type": "text"
            },
            "comment": {
              "properties": {
                "content": {
                  "type": "text"
                },
                "username": {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    }
  }
}

Его можно найтиblogиcommentоба какobjectтип для хранения. существуетElasticSearchпо умолчанию будет использоваться поле какobjectхранить.

Вставляем документ.

PUT blog/_doc/1
{
  "blog": {
    "title": "this is my first blog",
    "content": "this is my first blog content",
    "comment": {
      "content": "so bad!",
      "username": "li si"
    }
  }
}

Содержание этого документа приблизительно有人写了一篇博客,然后李四同学在下面批评说so bad.

Ищем по отзывам.

GET blog/_search
{
  "query":{
    "match": {
      "blog.comment.content": "bad"
    }
  }
}

данные можно искать.

Плоский

Здесь следует отметить, что对象数据最后在ES中都是会被flat(扁平化)的.

В чем смысл?

То есть вышеуказанные данные контента, наконец,ESхранится в следующем виде.

blog:this is my first blog
content:this is my first blog content
comment.content:so bad
comment.username:li si

Однако, в целом, блог определенно представляет собой не только один фрагмент данных, но в целом будет несколько фрагментов данных, что является отношением «один ко многим», упомянутым выше.

Обновляем предыдущие данные.

PUT blog/_doc/1
{
  "blog": {
    "title": "this is my first blog",
    "content": "this is my first blog content",
    "comment": [
      {
        "content": "oh so good!",
        "username": "zhang san"
      },
      {
        "content": "so bad!",
        "username": "li si"
      }
    ]
  }
}

Вышеуказанные данные означаютВ дополнение к тому, что Ли Си сказал плохо, есть третий брат Чжан, который сказал хорошо.

Мы также можем запросить его обычным образом в соответствии с предыдущим методом запроса. Однако, если мы теперь хотим связать запросы, мыНе только комментатор от Ли Си, но и вопрос, который Ли Си сказала хорошо. мы пишемboolЗапрос.boolМожно написать несколько запросов, либоtermвсе ещеmatchМожно написать только один запрос.

GET blog/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "blog.comment.content": "good"
          }
        },
        {
          "match": {
            "blog.comment.username": "li si"
          }
        }
      ]
    }
  }
}

Однако мы все же смогли запросить эти данные. Очевидно, что эти данные,Ли Си сказал плохое вместо хорошего, почему он все еще может найти это?

Это потому, что после того, как объект сплющен, вESхранится таким образом.

blog.comment.content:["oh so good!","so bad!"]
blog.comment.username:["zhang san","li si"]

Оба поля имеют форму массива для хранения данных. Между массивами и массивами нет соответствия.

ESдоblog.comment.coetentпосмотреть, есть лиgood, обнаружилось. сноваblog.comment.usernameпосмотреть, есть лиli siНашел еще там.

Наконец, эти данные запрашиваются.

Итак, как мы можем выполнить связанный запрос? использоватьnested, вложенный объект может быть.

вложенные объекты

Тип поля по умолчанию:objectтип для использованияnestedЕго нужно указать явно. После того, как мы удалим предыдущий индекс, перестроим индекс. Так какES, у нас нет возможности изменить предыдущийmapping, мы можем только удалить и перестроить. Если вам нужны предыдущие данные, вы можете использоватьreindexдля импорта данных в новый индекс.

PUT blog
{
  "mappings": {
    "_doc": {
      "properties": {
        "blog": {
          "properties": {
            "title": {
              "type": "keyword"
            },
            "content": {
              "type": "text"
            },
            "comment": {
              "type":"nested",
              "properties": {
                "content": {
                  "type": "text"
                },
                "username": {
                  "type": "keyword"
                }
              }
            }
          }
        }
      }
    }
  }
}

Давайте повторно вставим часть данных.

PUT blog/_doc/1
{
  "blog": {
    "title": "this is my first blog",
    "content": "this is my first blog content",
    "comment": [
      {
        "content": "oh so good!",
        "username": "zhang san"
      },
      {
        "content": "so bad!",
        "username": "li si"
      }
    ]
  }
}

Делаем попутный поиск.

GET blog/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "blog.comment.content": "good"
          }
        },
        {
          "match": {
            "blog.comment.username": "li si"
          }
        }
      ]
    }
  }
}

В это время мы обнаружили, что поиск соответствующих данных невозможен. Потому что в это время,ESправильноnestedСвязи объектов дополнительно сохраняются.

о написании

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

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

Если ничего из вышеперечисленного, то напишите, что вам больше всего хочется сказать после прочтения? Эффективная обратная связь и ваша поддержка — это то, что помогает мне больше всего.

Кроме того, я планирую снова поднять блог. Добро пожаловать в гостиесть арбуз.

меня зовут шейн. Сегодня 25 августа 2019 года. День 32 100-дневной писательской программы, 32/100.