Elasti c поиск в нескольких полях 1-N связанных данных в одном индексе - PullRequest
1 голос
/ 18 февраля 2020

Я несколько дней застрял с этой проблемой, читая документы Elasti c взад и вперед безрезультатно. Я надеюсь, что кто-то может сделать мне правильный ответ.

Предположим, есть два типа данных - родитель и ребенок, которые имеют отношение 1-N. Я храню их в том же индексе, используя custom type field . У них есть общие и разные поля. Чтобы привести конкретный пример, индекс и некоторые входные данные могут выглядеть примерно так:

PUT /myindex
{
  "mappings":
  {
    "properties": {
      "type": {"type": "keyword"},
      "fileid" : {"type": "keyword"},
      "dirid": {"type": "keyword"},
      "filename": {"type": "text"},
      "fileauthor": {"type": "text"},
      "dirpath": {"type": "text"}
    }
  }
}
PUT /myindex/_doc/1
{
  "type": "dir",
  "dirid": 1,
  "dirpath": "/home/jd/"
}
PUT /myindex/_doc/2
{
  "type": "dir",
  "dirid": 2,
  "dirpath": "/home/jd/Documents/CV/"
}
PUT /myindex/_doc/3
{
  "type": "file",
  "dirid": 2,
  "fileid": 1,
  "filename": "My-Resume.pdf",
  "fileauthor": "John Doe"
}
PUT /myindex/_doc/4
{
  "type": "file",
  "dirid": 1,
  "fileid": 2,
  "filename": "Some-CV.pdf",
  "fileauthor": "John Doe"
}
PUT /myindex/_doc/5
{
  "type": "file",
  "dirid": 1,
  "fileid": 3,
  "filename": "book.pdf",
  "fileauthor": "John Doe"
}

Теперь я хочу искать в текстовых полях, используя довольно сложные (из нескольких слов) запросы, такие как John Doe CV. Для отдельных type="dir" или type="file" это просто (и запрос будет возвращать документ с _id=4), но я также хотел бы получить «смешанные» результаты, когда часть запроса содержится в параметре parent-Speci * 1031. * поля и остальное в дочерних спецификациях c полей. В моем примере данных и запросов я бы хотел, чтобы он также возвращал _id=3, поскольку автор John Doe, а родительский dirpath содержит ключевое слово CV.

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

Почему-то я не нашел способа сделать это. Я знаю о типе join, но это, похоже, здесь не помогает, скорее наоборот. Многие предложения, вопросы SO и элементы документации устарели, поскольку ранее рекомендованная практика устарела.

Конечно, я мог бы просто заполнить каждую запись всеми данными (каждый type="file" просто скопировал бы значения dirpath родителя) , но это противоречит моему восприятию оптимального использования памяти и пространства.

Кто-нибудь знает, где искать дальше, пожалуйста? Большое спасибо.

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