Elasticsearch: Campos de valor nulo em consultas custom_score causam erros 'Sem campo'

Criado em 9 fev. 2011  ·  5Comentários  ·  Fonte: elastic/elasticsearch

Parece haver uma pegadinha ao usar consultas custom_score e tentar pontuar com base em campos que podem conter valores nulos.

Dado que tenho:

{"user": {"name": "John", "position": null}}

Quando eu consulto usando um custom_score e um script como:

{"script": "_score + doc['position'].value"}

Estou tendo o erro a seguir:

ElasticSearchIllegalArgumentException[No field found for [position]]; }]

Se eu adicionar outro usuário:

{"user": {"name": "Jane", "position": 1}}

Tudo funciona bem.

Acho que o comportamento padrão deve ser para campos de valor nulo retornarem nulo - e não gerar um erro.

Os exemplos acima podem parecer bobos, mas imagine preencher os índices com dados de um banco de dados, onde não há garantias de que uma coluna não conterá nada além de valores nulos. Você pode contornar isso convertendo seus campos em strings usando mapeamento, mas definitivamente sugiro que o ElasticSearch seja capaz de lidar com o valor do script de forma mais inteligente.

Comentários muito úteis

Isso deve funcionar:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Ou talvez até isso:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Mesmo assim, com data set suficiente, onde pelo menos um doc tem um valor de position em cada shard, você não deve precisar dessa verificação, e assim o desempenho do seu script será muito melhor.

Todos 5 comentários

Ah - e obrigado por um produto incrível! :-)

Ei,

Isso acontece porque esse campo ainda não foi introduzido (ele tem um valor nulo). Uma vez introduzido (com um único valor, no cluster), funcionará bem. Você também pode definir null-value nos mapeamentos que irão indexar um valor nulo específico quando esse campo for null . Como não foi introduzido, seu tipo não pode ser derivado.

Sim eu entendo isso. Não seria melhor o valor do script retornar null ou pelo menos ter algum tipo de função para verificar sua existência, em vez de gerar uma exceção e não fazer com que nenhum resultado fosse retornado?

Por exemplo:

{"script": "_score + (doc['position'].present ? doc['position'] : 0)"}

Isso deve funcionar:

{"script": "_score + (doc.containsKey('position') ? doc['position'].value : 0)"}

Ou talvez até isso:

{"script": "_score + (doc['position'] ? doc['position'].value : 0)"}

Mesmo assim, com data set suficiente, onde pelo menos um doc tem um valor de position em cada shard, você não deve precisar dessa verificação, e assim o desempenho do seu script será muito melhor.

Erro fatal: Não capturado [NoFieldFound]Nenhum campo encontrado: Contact._PloiciesLastApplicationDate0 Tentativa: 1 vez(es). jogado

Estou recebendo o seguinte erro ao atualizar o contato.

por exemplo:-

$checkExist = Infusionsoft_DataService::query(new Infusionsoft_Contact(), array('Phone1' => '(618)-795-0304'));

Estou buscando o contato e atualizando o contato com base no número do telefone, mas dá esse erro?

Obrigado!

Esta página foi útil?
0 / 5 - 0 avaliações