![](/img/trans.png)
[英]Elasticsearch: Is it possible to return the requested values of a list only, not all values of which one or more matched; else return null in field?
[英]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"
}
}
}
}
}
為了只返回 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.