Skip to content

Instantly share code, notes, and snippets.

@brun0xff
Last active August 3, 2018 23:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save brun0xff/5eef027a6f5f7959c910442423710597 to your computer and use it in GitHub Desktop.
Save brun0xff/5eef027a6f5f7959c910442423710597 to your computer and use it in GitHub Desktop.

1 - Ao adicionar um documento (dicionário) no Elasticsearch utilizando o método:

for ok, result in streaming_bulk(self.client, self.start_data_streaming(),
                                 index=self.index_name, doc_type=self.doc_type,
                                 chunk_size=self._CHUNK_SIZE):
    action, result = result.popitem()
    doc_id = '/%s/doc/%s' % (self.index_name, result['_id'])

Por exemplo: Ao enviar para ser indexado o dicionário product = {'url':"http://www.shoptime.com.br", 'title':'Camisa Palmeiras', _id:123}, No Elasticsearch é indexado desa forma:

{
  "_index": "product_tracker_development_product",
  "_type": "product",
  "_id": "123",
  "_score": 10.279345,
  "_source": {
    "title": "Camisa Palmeiras",
    "url": "http://www.shoptime.com.br",
    }
}

Por que _id não fica em _source junto com os demais?

2 - Sobre o fluxo de indexação de produtos.

  • A classe filha IndexerAffiliateProducts executa um método da classe pai AbstractIndexer chamada start_data_streaming(). O fato desse método ser abstrato faz com que a classe pai enxergue a implementação dele na classe filha?
  • Por que existe a necessidade da classe filha ter um método execute() apenas para executar o método run() na classe pai? Se a filha herda os métodos da classe pai, não bastava apenas chamar filha.run()?

3 - Sugestão de melhoria. No código abaixo, filtrar com o match de todos os produtos vindo do elasticsearch e só depois pegar um produto de cada parceiro. Por que? Ao pegar o primeiro de cada parceiro e só depois fazer o match(p1, p2) se o primeiro retornado pelo Elasticsearch não for um parceiro, um segundo produto nem chega a ter a chance de ser submetido ao match(p1, p2) e um produto deixa de ser exibido.

    def find_product(cls, product):
        similar_products = FindSimilarProductsCommand(product).execute()

        products = []
        added_partners = set()
        for similar_product in similar_products:
            if similar_product['partner_id'] not in added_partners:
                products.append(similar_product)
                added_partners.add(similar_product['partner_id'])

        product_matcher = ProductMatcher()
        products = [p for p in products if product_matcher.is_same_product(p, product)]

        partner_ids = [product['partner_id'] for product in products]
        partners_info = FindPartnersCommand(partner_ids).execute()

        for product in products:
            partner_id = product['partner_id']
            product['partner'] = partners_info.get(partner_id)

        return products

4 - ean, sku e update_at devem mesmo ser retornados ao cliente?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment