Анализ Google Custom Search API для документов Elasticsearch

Получив результаты из API пользовательского поиска Google и записав их в JSON, я хочу проанализировать это. JSON для создания действительных документов Elasticsearch. Вы можете настроить родительско-дочерние отношения для вложенных результатов. Однако эта связь, по-видимому, не определяется самой структурой данных. Я пробовал автоматическую загрузку, но безрезультатно.

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

Вот пример ввода:

# mock data structure
google = {"content": "foo", 
          "results": {"result_one": {"persona": "phone",
                                     "personb":  "phone",
                                     "personc":  "phone"
                                    },
                      "result_two": ["thing1",
                                     "thing2",
                                     "thing3"
                                    ],
                      "result_three": "none"
                     },
          "query": ["Taylor Swift", "Bob Dole", "Rocketman"]
}

# correctly formatted documents for _source of elasticsearch entry
correct_documents = [
    {"content":"foo"},
    {"results": ["result_one", "result_two", "result_three"]},
    {"result_one": ["persona", "personb", "personc"]},
    {"persona": "phone"},
    {"personb": "phone"},
    {"personc": "phone"},
    {"result_two":["thing1","thing2","thing3"]},
    {"result_three": "none"},
    {"query": ["Taylor Swift", "Bob Dole", "Rocketman"]}
]

Вот мой текущий подход, работа над которым все еще продолжается:

def recursive_dfs(graph, start, path=[]):
  '''recursive depth first search from start'''
  path=path+[start]
  for node in graph[start]:
    if not node in path:
      path=recursive_dfs(graph, node, path)
  return path

def branching(google):
    """ Get branches as a starting point for dfs"""
    branch = 0
    while branch < len(google):

        if google[google.keys()[branch]] is dict:

            #recursive_dfs(google, google[google.keys()[branch]])
            pass

        else:
            print("branch {}: result {}\n".format(branch,     google[google.keys()[branch]]))

        branch += 1

branching(google)

Вы можете видеть, что recursive_dfs() все еще нуждается в модификации для обработки строк и структур данных.

Я буду продолжать в том же духе, но если у вас есть мысли, предложения или решения, я был бы очень признателен. Спасибо за ваше время.


person Tyler    schedule 22.06.2015    source источник


Ответы (1)


вот возможный ответ на вашу проблему.

def myfunk( inHole, outHole):
    for keys in inHole.keys():
        is_list = isinstance(inHole[keys],list);
        is_dict = isinstance(inHole[keys],dict);
        if is_list:
            element = inHole[keys];
            new_element = {keys:element};
            outHole.append(new_element);
        if is_dict:
            element = inHole[keys].keys();
            new_element = {keys:element};
            outHole.append(new_element);
            myfunk(inHole[keys], outHole);
        if not(is_list or is_dict):
            new_element = {keys:inHole[keys]};
            outHole.append(new_element);
    return outHole.sort();
person Bobby Mcd    schedule 23.06.2015