2014-06-21 3 views
1

J'ai un ElasticDatastore dont j'ai besoin pour pouvoir retourner une liste de documents selon des critères arbitraires dans la logique métier.Découvrez ce que fait réellement ElasticLinq

La méthode ressemble actuellement quelque chose comme ça ...

private ElasticContext esLinq; 

private void initialise() { 
    esLinq = new ElasticContext(new ElasticConnection(endpoint, index: index)); 
} 

public IEnumerable<Entities.Item> Items(Func<Entities.Item, bool> predicate) { 
    var ret = esLinq.Query<Item>().Where(predicate); 
    return ret; 
} 

Je vous appelle comme ça

var newItems = dataStore.Items(x=> 
     x.SomeField == node.SomeValue.ToString() 
     & (x.AssignedTo == null 
     | x.AssigmentExpires < DateTime.UtcNow) 
    ).ToList(); 

état actuel des choses, la méthode renvoie aucun résultat. En utilisant une tête élastique (et curl), je peux vérifier qu'il y a des documents qui correspondent aux critères spécifiés dans l'index. Ma première supposition est que les noms de champs prévus par EsLinq sont incorrects (casing ... l'index a été construit en utilisant nest). Cependant, je ne peux pas trouver un bon moyen d'examiner ce que EsLinq envoie réellement à elasticsearch.

je peux faire

esLinq.Query<Item>().ToElasticSearchQuery(); 

Et obtenir une chaîne JSON qui représente le (vide) requête, cependant, ...Query<Item>().Where(predicate) retourne un IEnumerable<Item> qui ne dispose pas d'extension ToElasticSearchQuery.

Le compilateur accepte

ret.AsQueryable().ToElasticSearchQuery() 

mais je reçois un ArgumentException lors de l'exécution:

Query must be of type IElasticQuery<> to call ToElasticSearchQuery() 

Comment puis-je examiner la requête envoyé par EsLinq à ElasticSearch je peux diagnostiquer le problème que je suis frappe?

Répondre

4

Si vous installez Fiddler, vous pouvez voir le HTTP exact envoyé et renvoyé. Vous pouvez également utiliser:

  1. La méthode .ToQueryInfo() et examiner les propriétés .Body et .Uri
  2. L'interface ILog sur ElasticContext pour capturer la requête brute et la réponse

J'imagine le problème est que le mappage entre vos objets CLR et le nom du champ de document - par défaut les noms de champ camel-cases classe ElasticMapping et tente de pluriel les noms de type. Vous pouvez le désactiver avec des commutateurs de constructeur ou le sous-classer pour vos propres conventions spécifiques.

En outre, je pense que votre requête devrait dire || pour OR et & & pour AND - ces opérateurs booléens sont supportés mais | et & les opérations au niveau du bit ne le sont pas.