Elasti c search: Как искать в двух документах по одному индексу? - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть два документа, настроенные в одном индексе с именем инвентарь.

  1. профиль (это пользователи и мобильная информация)
  2. p2p-отношение

Свойства отображения индекса инвентаря следующие:

{
    "mappings": {
        "properties": {
            "type": {"type": "keyword"},
            "id": {"type": "keyword"},
            "sourceId": {"type": "keyword"},
            "targetId": {"type": "keyword"},
            "firstName": {"type": "text"},
            "lastName": {"type": "text"},
            "createdBy": {"type": "text"},
            "p_type": {"type": "text"},
            "model": {"type": "text"},
            "OS": {"type": "keyword"}
            }
        }
}

профиль содержит следующую информацию

пользователи:

{   "type":"profile",   "id" : "user1", "p_type" : "user",  "firstName" : "Ashok", "lastName" : "S" }
{   "type":"profile",   "id" : "user2", "p_type" : "user",  "firstName" : "Arun", "lastName" : "V" }

мобильные телефоны:

{   "type":"profile",   "id" : "mobile1", "p_type" : "mobile",  "model" : "samsung", "OS" : "Android" }
{   "type":"profile",   "id" : "mobile2", "p_type" : "mobile",  "model" : "iPhone", "OS" : "iOS" }

p2p-отношение имеет, какой пользователь использовал какую мобильную информацию:

{   "type":"p2p-relation",  "id" : "user1-owns-mobile1", "sourceId" : "user1",  "targetId" : "mobile1", "createdBy" : "admin" }
{   "type":"p2p-relation",  "id" : "user1-owns-mobile2", "sourceId" : "user1",  "targetId" : "mobile2", "createdBy" : "admin" }

В нашем случае нам нужно получить список мобильных телефонов android / iOS, принадлежащих пользователю, который мы получаем как вход от клиента.

То есть, если user1 запрашивает / mymobiles? Query = os == Android, он должен перевести это в ES и ожидать

{ "type": "profile", "id": "mobile1", "p_type": "mobile", "model": "samsung", "OS": "Android"}

как результат, и если user2 запрашивает то же самое, он должен вернуть пустое значение.

Я пробовал с запросом и bool. Но это поиск только в пределах одного документа. Как этого добиться в elasti c search?

1 Ответ

0 голосов
/ 23 апреля 2020

Выше модель подпадает под модель данных многие ко многим. Пользователь может иметь много мобильных телефонов, назначенных ему, и мобильное устройство может быть назначено многим пользователям в течение определенного периода времени. Поэтому изменил модель данных, чтобы хранить ее как вложенные объекты.

{
  "mappings": {
    "properties": {
        "type": {"type": "keyword"},
        "id": {"type": "keyword"},
        "firstName": {"type": "text"},
        "lastName": {"type": "text"},
        "createdBy": {"type": "text"},
        "model": {"type": "text"},
        "OS": {"type": "keyword"},
        "mobiles" : {
            "type" : "nested",
            "properties" : {
                "id": {"type": "keyword"},
                "model": {"type": "text"},
                "OS": {"type": "keyword"},
                "createdBy": {"type": "text"}
            }
        },
        "users" : {
            "type" : "nested",
            "properties" : {
                "id": {"type": "keyword"},
                "firstName": {"type": "keyword"},
                "lastName": {"type": "keyword"},
                "createdBy": {"type": "text"}                               
            }
        }
}}}

Но проблема в том, что, когда пользователю назначается мобильный телефон, у меня возникают дополнительные усилия по обновлению двух строк.

Данные хранятся следующим образом

{   "type":"profile",   "id" : "user1",  "firstName" : "Ashok", "lastName" : "S", "mobiles" : [ {"id" : "uuid1", "model": "samsung", "OS" : "Android"}] }

{   "type":"profile",   {"id" : "uuid1", "model": "samsung", "OS" : "Android"}, "users" : [ "id" : "user1",  "firstName" : "Ashok", "lastName" : "S"] }

И чтобы ответить на / mymobiles? Query = os == Android, я использовал следующий запрос.

{ 
"query": {
    "bool": {
        "must": [ 
            {
              { "term": {"OS": "android"} },
              "nested": {
                "path": "users",
                "query": {
                  "bool": {
                    "must": [ {"term": {"users.id": "user1"} }]
                  }
                }
              }
            }
        ]   
    }
}}

Я сослался на следующую ссылку, чтобы сделать это: https://medium.com/@mena.meseha / кратко опишите, как хранить сложные реляционные данные в эластичных поисках-f30277317b1

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