0

Pardonnez-moi mon nouveau-né car je suis nouveau à la fois à ElasticSearch et NEST. Je travaille sur un prototype pour évaluer ElasticSearch dans une solution .NET en cours d'implémentation. Le prototype compile et semble chercher, mais ne renvoie pas correctement les résultats. Il ne renvoie que les résultats sur quelques mots-clés, en minuscules seulement, tout en ignorant les autres et en ne renvoyant rien. Je pense qu'il y a quelque chose qui ne va pas dans ma requête. Voici la partie de la requête (supposons que les informations de connexion et l'index par défaut sont spécifiés et construits).ElasticSearch avec le problème de requête NEST

// string searchString to be searched against ProductName and Description fields.    
var searchResults = client.Search<Product>(s=>s 
      .From(0) 
      .Size(100) 
      .Query(q=>q.Term(p=>p.ProductName, searchString) || 
       q.Term(p=>p.Description, searchString) 
      )); 

Voici le modèle si nécessaire:

[ElasticType(IdProperty = "ProductID")] 
public class Product 
{ 
    [ScaffoldColumn(false)] 
    [JsonIgnore] 
    public int ProductID { get; set; } 

    [Required, StringLength(100), Display(Name = "Name")] 
    public string ProductName { get; set; } 

    [Required, StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)] 
    public string Description { get; set; } 

    public string ImagePath { get; set; } 

    [Display(Name = "Price")] 
    public double? UnitPrice { get; set; } 

    public int? CategoryID { get; set; } 
    [JsonIgnore] 
    public virtual Category Category { get; set; } 
} 

apprécie l'aide!

+1

Avez-vous vraiment l'intention que le nom du produit et la description correspondent à votre chaîne de recherche? –

+0

Je veux que cela corresponde, et oui j'ai utilisé l'opérateur OU aussi avec peu de changement. – Michael

+0

MISE À JOUR: D'accord, apparemment, j'ai fait une erreur de l'opérateur OU avant. Maintenant, la recherche fonctionne mieux, sauf qu'elle semble chambouler le cas des lettres ... par ex. "Custom" ne renvoie rien, mais "custom" renvoie "Kat Custom Car" ... – Michael

Répondre

2

Votre problème ici est que vous utilisez term queries, qui ne sont pas analysés et sont donc sensibles à la casse.

Essayez d'utiliser un match query (qui est analysée) à la place:

var searchResults = client.Search<Product>(s => s 
    .From(0) 
    .Size(100) 
    .Query(q => 
     q.Match(m => m.OnField(p => p.ProductName).Query(searchString)) || 
     q.Match(m => m.OnField(p => p.Description).Query(searchString)) 
    ) 
); 

prendre une étape further- puisque vous interrogez le même texte sur deux champs différents, vous pouvez utiliser un multi match query au lieu de combiner les deux requêtes terme:

var searchResults = client.Search<Product>(s => s 
    .From(0) 
    .Size(100) 
    .Query(q => q 
     .MultiMatch(m => m 
      .OnFields(p => p.Product, p => p.Description) 
      .Query(searchText) 
     ) 
    ) 
); 

Pour une meilleure compréhension de l'analyse, la section mapping and analysis de The Definitive Guide est une excellente lecture.

+0

Vous l'avez bien cloué! Cela a résolu mon problème. Savez-vous comment savoir comment faire une requête similaire à "contient"? (par exemple "kat" Kat's ...) – Michael

Questions connexes