Предыдущий отзыв
Последняя статья была написанаЗнакомство с 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.