Запрос индекса эластичного поиска для данных, отличных от 1: 1, с документом - PullRequest
0 голосов
/ 02 октября 2019

Если я начну с нормализованных данных, что-то вроде:

Book 
|->belongs to Author
|->belongs to Genre

И я денормализую это в моем индексе ES, я могу получить что-то со строками вроде:

book1 author1 genre1
book2 author1 genre2
book3 author2 genre1
book4 author3 genre1

ЭтоИндекс выглядит так, как будто он естественно отвечает на запросы о book, потому что каждый документ 1: 1 с book.

Но что, если я хочу ответить на вопросы о author или genre без ссылки на book? Скажем, выставить пользовательский интерфейс со списком author фильтруемых по author name и genre. Или список genre без ссылки на book или author?

Я мог бы легко создать индекс для каждого author, book и genre, но это либо приводит кмой индекс в зеркале моих нормализованных реляционных данных (что отрицает цель быстрого поиска в денормализованном индексе), или мне приходится обновлять 3 индекса каждый раз, когда меняется автор.

Если я решу упростить индексацию таким образом, создам ли я для себя непосильную проблему при запросе?

Агрегаты - это то, о чем я слышал для генерации документов, сгруппированных по некоторому общему полю,Это то, что я могу использовать здесь?

1 Ответ

0 голосов
/ 03 октября 2019

Это зависит от того, насколько сложен ваш набор данных. если у вас есть тонны полей, которые вы хотите нормализовать, вы можете использовать просмотр терминов и разделять Author и Book в отдельных индексах и связывать их, используя id.

Однако,если ваш набор данных не слишком велик, вы можете сделать это так же просто, как показано ниже:

Вы можете выполнить поиск по автору или книге, и он вернет все документы, соответствующие запросу

PUT t1

POST t1/_doc/1
{
  "book": "book1",
  "author": "author1"
}

POST t1/_doc/2
{
  "book": "book2",
  "author": "author1"
}

POST t1/_doc/3
{
  "book": "book3",
  "author": "author2"
}

POST t1/_doc/4
{
  "book": "book4",
  "author": "author3"
}

QUERY 1 - поиск книг - возвращает книгу 1

 POST t1/_search
    {
      "query": {
        "terms": {
          "book": [
            "book1"
          ]
        }
      }
    }

    #Response
    {
      "took" : 0,
      "timed_out" : false,
      "_shards" : {
        "total" : 1,
        "successful" : 1,
        "skipped" : 0,
        "failed" : 0
      },
      "hits" : {
        "total" : {
          "value" : 1,
          "relation" : "eq"
        },
        "max_score" : 1.0,
        "hits" : [
          {
            "_index" : "t1",
            "_type" : "_doc",
            "_id" : "1",
            "_score" : 1.0,
            "_source" : {
              "book" : "book1",
              "author" : "author1"
            }
          }
        ]
      }
    }

QUERY 2 - поиск авторов - возвращает book1 и book2

POST t1/_search
{
  "query": {
    "terms": {
      "author": [
        "author1"
      ]
    }
  }
}

#Author Response
{
  "took" : 0,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 2,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "t1",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "book" : "book1",
          "author" : "author1"
        }
      },
      {
        "_index" : "t1",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "book" : "book2",
          "author" : "author1"
        }
      }
    ]
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...