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 paiAbstractIndexer
chamadastart_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étodorun()
na classe pai? Se a filha herda os métodos da classe pai, não bastava apenas chamarfilha.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?