Pourquoi Elasticsearch champ "non analysé" est divisé en termes?

J'ai le champ suivant dans ma définition de mappage:

...
"my_field": {
  "type": "string",
  "index":"not_analyzed"
}
...

Quand je l'indice de document avec la valeur de my_field = 'test-some-another' cette valeur est divisée en 3 termes: test, some, another.

Ce que je fais mal?

, j'ai créé l'index suivant:

curl -XPUT localhost:9200/my_index -d '{
   "index": {
    "settings": {
      "number_of_shards": 5,
      "number_of_replicas": 2
    },
    "mappings": {
      "my_type": {
        "_all": {
          "enabled": false
        },
        "_source": {
          "compressed": true
        },
        "properties": {
          "my_field": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
  }
}'

Ensuite, j'indexe le document suivant:

curl -XPOST localhost:9200/my_index/my_type -d '{
  "my_field": "test-some-another"
}'

Ensuite, j'utilise le plugin https://github.com/jprante/elasticsearch-index-termlist avec L'API suivante: curl -XGET localhost:9200/my_index/_termlist Cela me donne ce qui suit réponse:

{"ok":true,"_shards":{"total":5,"successful":5,"failed":0},"terms": ["test","some","another"]}

21
demandé sur Georgi 2012-05-14 16:08:28

2 réponses

Vérifiez que le mappage est réellement défini en exécutant:

curl localhost:9200/my_index/_mapping?pretty=true

La commande qui crée l'index semble incorrecte. Il ne devrait pas contenir "index" : { en tant qu'élément racine. Essayez ceci:

curl -XPUT localhost:9200/my_index -d '{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 2
  },
  "mappings": {
    "my_type": {
      "_all": {
        "enabled": false
      },
      "_source": {
        "compressed": true
      },
      "properties": {
        "my_field": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}'  
22
répondu imotov 2012-05-14 13:34:28

Dans ElasticSearch, un champ est indexé lorsqu'il entre dans l'index inversé, la structure de données que lucene utilise pour fournir ses capacités de recherche en texte intégral. Si vous souhaitez effectuer une recherche sur un champ, vous devez l'indexer. Lorsque vous indexez un champ, vous pouvez décider si vous voulez l'indexer tel quel, ou si vous voulez l'analyser, ce qui signifie décider d'un tokenizer à appliquer à celui-ci, ce qui générera une liste de jetons (mots) et une liste de filtres de jetons pouvant modifier le champ généré jetons (même ajouter ou supprimer certains). La façon dont vous indexez un champ affecte la façon dont vous pouvez le rechercher. Si vous indexez un champ mais ne l'analysez pas, et que son texte est composé de plusieurs mots, vous pourrez trouver ce document uniquement à la recherche de ce texte spécifique exact, espaces inclus.

Vous pouvez avoir des Champs sur lesquels vous souhaitez uniquement rechercher, et ne jamais afficher: indexé et non stocké (par défaut dans lucene). Vous pouvez avoir des champs que vous souhaitez rechercher et également récupérer: indexé et stocké. Vous peut avoir des champs que vous ne voulez pas rechercher, mais vous voulez récupérer pour les afficher.

4
répondu Sudhanshu Gaur 2015-08-22 10:50:26