Nenhum mapeamento encontrado para o campo para classificar no ElasticSearch

117

Elasticsearch lança uma SearchParseExceptionconsulta durante a análise se houver alguns documentos encontrados que não contêm campos usados ​​nos critérios de classificação.

SearchParseException: Parse Failure [Nenhum mapeamento encontrado para [preço] para classificar em]

Como posso pesquisar esses documentos com sucesso, mesmo se alguns estiverem faltando o pricecampo?

Yadu
fonte
1
Sua pergunta / resposta resolveu meu problema - obrigado. Eu editei para generalizar um pouco, fique à vontade para reverter se isso não for adequado para você.
Paul Bellora
1
Referência para lidar com este problema
Elasticsearch

Respostas:

116

Depois de cavar mais, encontrei a solução fornecida a seguir. ignore_unmappeddeve ser explicitamente definido como truena cláusula de classificação.

"sort" : [
       { "rating": {"order" : "desc" , "ignore_unmapped" : true} },
       { "price": {"order" : "asc" , "missing" : "_last" , "ignore_unmapped" : true} }
]

Para obter mais informações, dê uma olhada nas referências do Elasticsearch para:

Yadu
fonte
Olá, estou com o mesmo problema e não entendo como isso funciona ... Os atributos ausentes e ignore_unmapped devem funcionar juntos certo? Se, por exemplo, eu definir missing como "_last" e ignore_unmapped como "false", ainda tenho o problema, mas quero que os documentos estejam nos resultados em todos os casos, mesmo que não tenham o atributo.
c4k
Eu tenho esse problema e "ignore_unmapped" não funciona se o seu _type estiver vazio (ou seja, sem nenhum documento indexado).
reinaldoluckman
7
Parece que a nova estratégia é usar unmapped_type
lukmdo
2
Minhas consultas sempre funcionaram até hoje sem atualizar nenhuma biblioteca etc. mas hoje comecei a receber este mesmo erro. Agora eu adicionei "ignore_unmapped" : truee começou a funcionar de novo, mas o estranho é o que aconteceu nos bastidores! Quem sabe! Enfim, agora funciona. +1
BentCoder
1
Alguém pode esclarecer a diferença entre "ausente" e "não mapeado"? Para um determinado campo, se alguns documentos o possuem e outros não, esse campo é tratado como "ausente" ou "não mapeado"? "Ausente" significa que o campo está no documento, mas o valor correspondente é nulo?
Sher10ck
43

Para aqueles que procuram um exemplo de ambos ignore_unmappede unmapped_typeconsulte a minha resposta aqui .

Observe que "ignore_unmapped" agora está obsoleto em favor de "unmapped_type". Isso foi feito como parte do # 7039

Da documentação: Antes da 1.4.0 havia o parâmetro booleano ignore_unmapped, que não era informação suficiente para decidir sobre os valores de classificação a serem emitidos e não funcionava para pesquisa de índice cruzado. Ainda é compatível, mas os usuários são incentivados a migrar para o novo unmapped_type.

Por padrão, a solicitação de pesquisa falhará se não houver mapeamento associado a um campo. A opção unmapped_type permite ignorar os campos que não possuem mapeamento e não classificar por eles. O valor deste parâmetro é usado para determinar quais valores de classificação emitir. Aqui está um exemplo de como ele pode ser usado:

{
    "sort" : [
        { "price" : {"unmapped_type" : "long"} },
    ],
    "query" : {
        "term" : { "user" : "kimchy" }
    }
}

Se algum dos índices consultados não tiver um mapeamento de preço, o Elasticsearch o tratará como se houvesse um mapeamento do tipo longo, com todos os documentos neste índice sem valor para este campo.

Navneet Kumar
fonte
3

Aparentemente, ElasticSearch não classifica com base em valores nulos. Eu estava supondo que ele trataria null como estando no início ou no final (como ocorre com a ordenação SQL), mas acredito que também aciona esse erro.

Portanto, se você vir este erro, pode ser necessário garantir que o atributo sort tenha um valor padrão quando for enviado para ElasticSearch.

Eu tive este erro com Rails + ElasticSearch + Tire porque a coluna de classificação não tinha um valor padrão, então estava sendo enviada para ES como nula.

Esse problema indica que os valores nulos estão sendo tratados, mas não foi minha experiência. É algo que vale a pena tentar de qualquer maneira.

mahemoff
fonte
2

Tive o mesmo problema (sorta; obteria alguns erros, mas alguns resultados), mas no meu caso minha pesquisa estava sendo emitida na raiz (nenhum índice especificado), e os erros que estava recebendo eram porque a pesquisa / ordem também era olhando para um índice Kibana.

Erro estúpido, mas talvez isso ajude outra pessoa que acaba aqui.

James Boutcher
fonte
eu tenho o mesmo problema ... mas quando eu especifico ignorar não mapeado, eu não obtenho nenhuma classificação ao pesquisar a raiz ... isso limita a capacidade de pesquisar por mim se eu tiver que definir o índice ... eu simplesmente gostaria de todos resultados correspondentes sejam classificados por um campo, se existir, e preencha usar um padrão para aqueles que não o
fazem
2

Elasticsearch 6.4

simplesmente especifique o índice e pronto em Kibana

ANTES

GET /_search
{
 
  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}

DEPOIS DE

GET /document-index/contact/_search  (here)
{

  "query": {
    "exists": {
      "field": "document_id"
    }
  },
  "sort": [
    {
      "document_id": { "order": "asc"  },
      "created_at":  { "order": "desc" }
    }
  ]
}
Brian Sanchez
fonte
1

se você estiver usando o ES 6.7

tente este

sort : ["title.keyword:desc"]
Khalid Skiod
fonte
Isso me ajudou - elástico 7,3
mirik
0

Você também pode usar um script, o que lhe dá alguma flexibilidade:

"sort" : {
    "_script" : {
        "type" : "number",
        "script" : {
            "lang": "painless",
            "source": "return !doc['price'].empty ? doc['price'].value : 0"
        },
        "order" : "desc"
    }
}
Rafal Enden
fonte
0

Quando usamos o código abaixo, onde Added_on é a data, o que acontece !! o texto do atributo é analisado, o que significa que é dividido em palavras distintas quando armazenado e permite pesquisas de texto livre em uma ou mais palavras no campo

portanto, há "texto" e "palavra-chave" associados aos campos, portanto, se precisarmos usar agregação na consulta, precisaremos do valor do campo em geral, a palavra-chave.

BEFORE

"_source":{....}
"query" : {...}
"sort": [
{
  "added_on": {
    "order": "desc"
  }
}
]

AFTER
"_source":{....}
"query" : {...}
"sort": [
{
  "added_on.keyword": {
    "order": "desc"
  }
}
]
Abhishek
fonte