Простой способ найти кого из них в одной компании со мной? - PullRequest
0 голосов
/ 21 сентября 2019

Имеется поле индекса, как показано ниже, оно сохраняет информацию о том, кто в какой компании и на какой позиции

{
    "createtime" : 1562844632272,
    "post" : "director",
    "personId" : 30007346088,
    "comId" : 20010774891
 }

теперь хочет найти партнеров кого-то, то есть какой человек находится в той же компании.Теперь моя реализация -

сначала найдите связанные компании человека (максимум 500)

{
    "query": { "term": { "personId": 30007346088 } },
    "sort": [ { "createtime": "desc" } ],
    "_source": ["comId"],
    "size":500
}

затем найдите связанных компаний этих людей и исключите текущего человека и удалите дублирующегося партнера (аналогично самое большее500 партнеров)

{
    "query": {
        "bool": {
            "must": [{ "terms": { "comId": [20010774891,...] } } ],
            "must_not": [ {"term":{"personId":30007346088}} ]
        }
    },
    "aggs" : {
        "personId" : {
            "terms" : {
                "field" : "personId",
                "size": 500
            }
        }
    },
    "size":0    
}

Очевидно, что это немного сложно, если существует какой-то более простой способ его реализации?

1 Ответ

0 голосов
/ 29 сентября 2019

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

Уникальный документ для каждого человека, с идентификатором документа, совпадающим с идентификатором лица и компанией, хранящимся в виде массива

POST indexperson/_doc/1
{
  "createtime": 1562844632272,
  "personId": 1,
  "company": [
    {
      "id": 100,
      "post": "director"
    },
    {
      "id": 100,
      "post": "director"
    }
  ]
}

Данные:

 [
      {
        "_index" : "indexperson",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "createtime" : 1562844632272,
          "personId" : 1,
          "company" : [
            {
              "id" : 100,
              "post" : "director"
            },
            {
              "id" : 101,
              "post" : "director"
            }
          ]
        }
      },
      {
        "_index" : "indexperson",
        "_type" : "_doc",
        "_id" : "2",
        "_score" : 1.0,
        "_source" : {
          "createtime" : 1562844632272,
          "personId" : 2,
          "company" : [
            {
              "id" : 101,
              "post" : "director"
            }
          ]
        }
      },
      {
        "_index" : "indexperson",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "createtime" : 1562844632272,
          "personId" : 3,
          "company" : [
            {
              "id" : 100,
              "post" : "director"
            }
          ]
        }
      },
      {
        "_index" : "indexperson",
        "_type" : "_doc",
        "_id" : "4",
        "_score" : 1.0,
        "_source" : {
          "createtime" : 1562844632272,
          "personId" : 4,
          "company" : [
            {
              "id" : 104,
              "post" : "director"
            }
          ]
        }
      }
    ]

Запрос: Использование (поиск терминов) [https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-terms-query.html]. Поиск терминов принимает идентификатор документа в качестве параметра

GET indexperson/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "terms": {
            "company.id": {
              "index": "indexperson",  
              "id": "1", --> get all docs in indexperson which match with company id
              "path": "company.id"
            }
          }
        }
      ],
      "must_not": [
        {
          "term": {
            "personId": {
              "value": 2
            }
          }
        }
      ]
    }
  }
}

Результат:

"hits" : [
      {
        "_index" : "indexperson",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "createtime" : 1562844632272,
          "personId" : 1,
          "company" : [
            {
              "id" : 100,
              "post" : "director"
            },
            {
              "id" : 101,
              "post" : "director"
            }
          ]
        }
      },
      {
        "_index" : "indexperson",
        "_type" : "_doc",
        "_id" : "3",
        "_score" : 1.0,
        "_source" : {
          "createtime" : 1562844632272,
          "personId" : 3,
          "company" : [
            {
              "id" : 100,
              "post" : "director"
            }
          ]
        }
      }
    ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...