簡體   English   中英

是否可以為elasticsearch搜索返回字段的所有分組值?

[英]Is it possible to return all the grouped values ​of a field for an elasticsearch search?

我有以下查詢,該查詢通常在['hits'] ['total']字段中返回['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 的大小?

這是我的映射:

{
  "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"
        }
      }
    }
  }
}

如果我理解正確,您需要所有匹配文檔的特定字段(在您的示例中為 426),同時將大小保持為 40,如果是這種情況,則不可能。

total表示索引中的文檔總數,匹配查詢,而size用於based on size索引中的文檔based on size (基於分數)返回頂部。

您可以在搜索響應中使用源過濾檢索到的特定字段,但您必須提供一個較大的大小參數值(出於性能原因,默認值為 10)。

為了只返回 40 次點擊但給定字段(例如Codigo )的所有 426 次出現,您可以這樣做:

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 次點擊,但在aggregations.occurrences.hits出現了 426 次Codigo

您可能需要更改索引的設置才能使其工作,因為默認情況下, top_hits聚合只會返回 100 個命中:

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
            }
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM