Mot-clé tokenizer de mappage élastique pour éviter de scinder des jetons et activer l'utilisation de caractères génériques

J'essaie de faire une fonction d'auto-complétion avec angularjs et elasticsearch sur un domaine donné, par exemple countryname. il peut contenir des noms comme "France", "Espagne" ou "composé des noms de" j'aime "Sierra Leone".

Dans la cartographie de ce champ est not_analyzed pour éviter élastique pour marquer ", composée de noms"

"COUNTRYNAME" : {"type" : "string", "store" : "yes","index": "not_analyzed" }

J'ai besoin d'interroger elasticsearch:

  • pour filtrer le document avec quelque chose comme "countryname:valeur", où la valeur peut contenir des caractères génériques
  • et de faire une agrégation sur le countryname renvoyé par le filtre, ( je ne l'agrégation pour ne recevoir que des données distinctes, le comte est inutile pour moi, peut-être il est une meilleure solution)

Je ne peux pas utiliser les caractères génériques avec le "not_analyzed" champ :

c'est ma requête mais générique en valeur "variable" ne fonctionne pas et il est sensible à la casse :

Le générique seul son travail :

curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
  "fields": [
    "COUNTRYNAME"
  ],
  "query": {
    "query_string": {
      "query": "COUNTRYNAME:*"
    }
  },
  "aggs": {
    "general": {
      "terms": {
        "field": "COUNTRYNAME",
        "size": 0
      }
    }
  }
}'

mais cela ne fonctionne pas (franc*) :

curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
  "fields": [
    "COUNTRYNAME"
  ],
  "query": {
    "query_string": {
      "query": "COUNTRYNAME:Franc*"
    }
  },
  "aggs": {
    "general": {
      "terms": {
        "field": "COUNTRYNAME",
        "size": 0
      }
    }
  }
}'

J'ai essayé aussi avec bool must query mais ne fonctionnent pas avec ce not_analyzed champ et générique :

curl -XGET 'local_host:9200/botanic/specimens/_search?size=0' -d '{
  "fields": [
    "COUNTRYNAME"
  ],
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "COUNTRYNAME": "Franc*"
          }
        }
      ]
    }
  },
  "aggs": {
    "general": {
      "terms": {
        "field": "COUNTRYNAME",
        "size": 0
      }
    }
  }
}'

Ce que je suis absent ou mal? dois-je laisser le champ analyzed dans la cartographie et l'utilisation d'un autre analyseur qui ne split composé de nom en jeton??

source d'informationauteur AlainIb | 2014-10-21