Je suis plutôt nouveau sur ES et j'essaie de résoudre le problème suivant.

J'ai créé un index dans mon Elasticsearch avec la configuration suivante :

client.Indices.Create(lineItemIndex,
                c => c
                    .Settings(s => s
                        .Setting("max_ngram_diff", 13)
                        .Analysis(a => a
                            .Tokenizers(tf => tf
                                .NGram("mynGram", td => td
                                    .MaxGram(15).MinGram(2)))
                            .Analyzers(aa => aa
                                .Custom("mynGram_analyzer", ca => ca
                                    .Filters(new List<string> {"lowercase"})
                                    .Tokenizer("mynGram")))))
                    .Map<ElasticSearchLineItem>(m => m
                        .Properties(ps => ps
                            .Text(ss => ss
                                .Name(na => na.LineItemName)
                                .Fields(ff => ff
                                    .Keyword(k => k
                                        .Name("keyword"))
                                    .Text(tx => tx
                                        .Name("fulltext")
                                        .Analyzer("whitespace")
                                        .Boost(10.0))
                                    .Text(tx => tx
                                        .Name("partial")
                                        .Analyzer("mynGram_analyzer")
                                        .Boost(1.0)))))
                        .Properties(ps => ps
                            .Keyword(kw => kw
                                .Name(na => na.LineItemId)
                                .Index(false)))
                        .Properties(ps => ps
                            .Keyword(kw => kw
                                .Name(na => na.Id)
                                .Index(false)))
                        .Properties(ps => ps
                            .Text(ss => ss
                                .Name(na => na.LineItemNumber)
                                .Fields(ff => ff
                                    .Keyword(k => k
                                        .Name("keyword"))
                                    .Text(tx => tx
                                        .Name("fulltext")
                                        .Analyzer("whitespace")
                                        .Boost(10.0))
                                    .Text(tx => tx
                                        .Name("partial")
                                        .Analyzer("mynGram_analyzer")
                                        .Boost(1.0)))))
                        .Properties(ps => ps
                            .Keyword(ss => ss
                                .Name(na => na.SupplierName)
                                .Index(false)))
                        .Properties(ps => ps
                            .Keyword(ss => ss
                                .Name(na => na.Unit)
                                .Index(false)))
                        .Properties(ps => ps
                            .Number(ss => ss
                                .Name(na => na.PriceAmount)
                                .Type(NumberType.ScaledFloat).ScalingFactor(100)
                                .Index(false)))
                        .Properties(ps => ps
                            .Keyword(ss => ss
                                .Name(na => na.Currency)
                                .Index(false)))
                        .Properties(ps => ps
                            .Keyword(ss => ss
                                .Name(na => na.SupplierId)
                                .Index(false)))
                        .Properties(ps => ps
                            .Text(ss => ss
                                .Name(na => na.ImageUrl)
                                .Index(false)))
                        .Properties(ps => ps
                            .Text(ss => ss
                                .Name(na => na.SupplierPriceListId)
                                .Index(false)))));

Je ma solution, nous avons un champ de recherche, pour la recherche.

Cependant, nous sommes également supposés pouvoir filtrer la recherche en fonction de SupplierId. Ainsi, une personne effectuant une recherche pourrait avoir plusieurs SupplierId dont elle ne voudrait voir que les résultats.

J'ai essayé de créer la requête suivante :

var esSearch2 = new SearchDescriptor<ElasticSearchLineItem>()
            .From(0)
            .Take(250)
            .Query(q => q
                .Bool(b => b
                    .Must(mu => mu
                        .MultiMatch(m => m
                            .Fields(f => f
                                .Field(ff => ff
                                    .LineItemName.Suffix("fulltext"))
                                .Field(ff => ff
                                    .LineItemName.Suffix("partial"))
                                .Field(ff => ff
                                    .LineItemNumber.Suffix("fulltext"))
                                .Field(ff => ff
                                    .LineItemNumber.Suffix("partial")))
                        .Query(request.SearchWord)
                        .Fuzziness(Fuzziness.Auto)
                        ))                        
                    .Filter(f => f
                        .Terms(t => t
                            .Verbatim()
                            .Field(p => p
                                .SupplierId.Suffix("keyword"))
                            .Terms(request.ListOfFavorites.ToArray())))));

Cela ne renvoie rien, que request.ListOfFavorites soit vide ou non. Mais si je supprime mon filtre, il renverra correctement les résultats.

Je suppose qu'il me manque quelque chose, ou ma commande est foirée. Quelqu'un peut-il aider simplement ici?

Remarque : j'utilise ES 7.5.1 et NEST 7.5.1

ÉDITER:

J'ai modifié mon index et supprimé Index(false) de mon champ supplierId.

Voici la cartographie telle qu'elle apparaît dans kibana après la mise à jour

{
"mapping": {
"properties": {
  "currency": {
    "type": "keyword",
    "index": false
  },
  "id": {
    "type": "keyword",
    "index": false
  },
  "imageUrl": {
    "type": "text",
    "index": false
  },
  "lineItemId": {
    "type": "keyword",
    "index": false
  },
  "lineItemName": {
    "type": "text",
    "fields": {
      "fulltext": {
        "type": "text",
        "boost": 10,
        "analyzer": "whitespace"
      },
      "keyword": {
        "type": "keyword"
      },
      "partial": {
        "type": "text",
        "analyzer": "mynGram_analyzer"
      }
    }
  },
  "lineItemNumber": {
    "type": "text",
    "fields": {
      "fulltext": {
        "type": "text",
        "boost": 10,
        "analyzer": "whitespace"
      },
      "keyword": {
        "type": "keyword"
      },
      "partial": {
        "type": "text",
        "analyzer": "mynGram_analyzer"
      }
    }
  },
  "priceAmount": {
    "type": "scaled_float",
    "index": false,
    "scaling_factor": 100
  },
  "supplierId": {
    "type": "keyword"
  },
  "supplierName": {
    "type": "keyword",
    "index": false
  },
  "supplierPriceListId": {
    "type": "text",
    "index": false
  },
  "unit": {
    "type": "keyword",
    "index": false
  }
}
}
}
0
Christian A 7 févr. 2020 à 14:59

1 réponse

Meilleure réponse

Dans votre mappage, vous avez spécifié SupplierId comme étant exclu de l'index, vous ne pourrez donc pas effectuer de recherche dessus.

.Properties(ps => ps
    .Keyword(ss => ss
        .Name(na => na.SupplierId)
        .Index(false)))

De plus, vous n'avez pas besoin de spécifier de suffixe pour votre champ car il n'est pas défini comme multichamp, donc simplement

.Filter(f => f
    .Terms(t => t
        .Verbatim()
        .Field(p => p.SupplierId)
        .Terms(request.ListOfFavorites.ToArray())))));

Est assez.

J'espère que cela pourra aider.

1
Rob 7 févr. 2020 à 12:31