python—是否可以返回所有分组的值​ElasticSearch的字段?

xkftehaa  于 2021-06-10  发布在  ElasticSearch
关注(0)|答案(2)|浏览(363)

我有下面的查询,通常在字段中返回 ['hits'] ['total'] 点击率比我指定的要高 size .
例如:

query_body = {
    "from": 0,
    "size": 40,
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match":{
                        "query": 'caderno preto',
                        "fields":[
                            "DescricaoSEO",
                            "TermoBusca",
                            "Fabricante"
                        ],
                        "minimum_should_match":"100%",
                    }
                }
            ]
        }
    }
}

我的查询返回前40次点击,但当我打印总点击数时:

print(retornoES['hits']['total'])
{'value': 426, 'relation': 'eq'}

有没有办法返回一个字段,查询中所有426都保持前40个字段的大小?
这是我的Map:

{
  "mappings": {
    "_doc": {
      "properties": {
        "Ativo": {
          "type": "boolean"
        },
        "BlackFriday": {
          "type": "boolean"
        },
        "CD_Classificacao": {
          "type": "long"
        },
        "CD_Grupo": {
          "type": "long"
        },
        "CD_Subgrupo": {
          "type": "long"
        },
        "CD_TipoProduto": {
          "type": "long"
        },
        "CampoPesquisa": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "Codigo": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "CurvaABC": {
          "type": "float"
        },
        "DS_Classificacao": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "DS_Grupo": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "DS_Parcelamento": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "DePor": {
          "type": "float"
        },
        "Descontinuado": {
          "type": "boolean"
        },
        "Descricao": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "DescricaoSEO": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "Download": {
          "type": "boolean"
        },
        "Estoque": {
          "type": "long"
        },
        "ExclusivoParceiro": {
          "type": "boolean"
        },
        "Fabricante": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "Garantia": {
          "type": "boolean"
        },
        "Imagem": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "Link": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "LinkProduto": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "NM_Produto": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "Parcelamento": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "PrecoCusto": {
          "type": "float"
        },
        "PrecoDesconto": {
          "type": "float"
        },
        "PrecoOriginal": {
          "type": "float"
        },
        "PrecoVenda": {
          "type": "float"
        },
        "PrecoVendaAssinatura": {
          "type": "float"
        },
        "Prioridade": {
          "type": "long"
        },
        "Selo": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "TemEstoque": {
          "type": "long"
        },
        "TermoBusca": {
          "type": "text",
          "fields": {
            "keyword": {
              "type": "keyword",
              "ignore_above": 256
            }
          }
        },
        "VL_PrecoVenda": {
          "type": "float"
        }
      }
    }
  }
}
wgxvkvu9

wgxvkvu91#

如果我理解正确,您希望为所有匹配的文档指定一个特定字段(在您的示例中为426),同时保持大小为40,如果是这种情况,则不可能。 total 表示索引中与查询匹配的文档总数 size 用于返回顶部 based on size 索引中的文档(基于分数)。
您可以在搜索响应中使用源筛选或检索的特定字段,但必须为size param提供一个较高的值(出于性能原因,默认值为10)。

lnlaulya

lnlaulya2#

为了只返回40次命中,但返回给定字段的所有426次(例如。 Codigo ),您可以这样做:

query_body = {
    "from": 0,
    "size": 40,
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match":{
                        "query": 'caderno preto',
                        "fields":[
                            "DescricaoSEO",
                            "TermoBusca",
                            "Fabricante"
                        ],
                        "minimum_should_match":"100%",
                    }
                }
            ]
        }
    },
    "aggs": {
        "occurrences": {
            "top_hits": {
                "_source": ["Codigo"],
                "size": 1000
            }
        }
    }
}

你只会得到40次点击,但是426次 Codigoaggregations.occurrences.hits .
您可能需要更改索引的设置才能使其正常工作,因为默认情况下,一次搜索只返回100次命中 top_hits 聚合:

PUT my-index/_settings
{
   "index.max_inner_result_window": 1000
}

如果 Codigo 在所有文档中都是唯一的,那么上面的查询将满足您的需要,但是,如果 Codigo 不是唯一的,你最好使用 terms 聚合(由es ninja建议)

query_body = {
    "from": 0,
    "size": 40,
    "query": {
        "bool": {
            "must": [
                {
                    "multi_match":{
                        "query": 'caderno preto',
                        "fields":[
                            "DescricaoSEO",
                            "TermoBusca",
                            "Fabricante"
                        ],
                        "minimum_should_match":"100%",
                    }
                }
            ]
        }
    },
    "aggs": {
        "occurrences": {
            "terms": {
                "field": "Codigo.keyword",
                "size": 1000
            }
        }
    }
}

相关问题