2011-06-03 3 views
9

J'essaie de configurer un index ElasticSearch avec différents analyseurs pour les champs individuels. Cependant, je n'arrive pas à trouver un moyen de définir des analyseurs spécifiques au champ; voici comment je crée mon (test) IndiceLe mappage ElasticSearch ne fonctionne pas

curl -XPOST localhost:9200/twitter 
curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d ' 
{ 
    "tweet" : { 
     "properties" : { 
      "message" : { 
       "type" : "string", 
       "search_analyzer" : "snowball", 
       "index_analyzer" : "snowball" 
      } 
     } 
    } 
}' 

Si je lis correctement la documentation, alors cela devrait créer l'index « Tweet » « twitter » avec le type et le contenu du champ « message » devrait être analysé à travers l'analyseur de bourrage de boule de neige. Pour tester cela, j'ai essayé les requêtes suivantes:

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ 
    "message" : "Look, a fighting War-Unicorn!" 
}' 
curl -XGET localhost:9200/twitter/_search?q=fight 

Si je ne me trompe pas, cela doit retourner un coup, que la lutte est la tige pour le combat; le problème est, ce n'est pas, je reçois zéro hits. Il semble que ElasticSearch ignore complètement le mappage (bien qu'ElasticSearch accepte toutes ces requêtes, car je reçois 'ok' pour chacune d'entre elles.)

J'ai déjà essayé de remplacer l'analyseur par défaut par un analyseur de boule de neige, et alors ça marche; En fait, je dois absolument avoir des analyseurs spécifiques au champ, donc cela ne va pas m'aider. J'ai aussi essayé différents analyseurs et des choses comme mettre "index" à "non", mais en vain.

Qu'est-ce que je fais mal?

Répondre

11

Pour utiliser un analyseur spécifique à un champ, vous devez spécifier ce champ dans la requête. Sinon, l'analyseur par défaut est utilisé. Essayez

curl -XGET 'localhost:9200/twitter/_search?q=message:fight' 

ou

curl -XGET 'localhost:9200/twitter/_search?df=message&q=looking' 
+1

ok, c'est pour la recherche analyseur .. mais la boule de neige index_analyzer ne devrait-elle pas réduire "fighting" à "fight", comme c'est le cas lors de l'exécution de la phrase directement via l'API d'analyse? Dans ce cas, la recherche de "fight" retournerait un hit, quel que soit l'analyseur de recherche utilisé, n'est-ce pas? Et, plus important encore, que se passe-t-il si je ne sais pas encore dans quel champ chercher? Je n'en ai qu'un ici, d'accord, mais il me faudra en avoir plusieurs à la fin, et les fouiller. – Felix

+1

L'analyseur de boule de neige réduit "combat" à "combattre" dans le champ "message" en effet. Cependant, si vous ne spécifiez pas de champ dans votre recherche, vous recherchez un champ spécial "_all" qui indexe le contenu du champ "message" (et tous les autres champs si vous en avez) mais ce contenu est analysé par défaut. . – imotov

+0

ok, que je comprends - merci d'expliquer, @imotov! quand même ... si l'analyseur d'index réduit "combat" à "se battre", ne serait-ce pas "se battre" être le jeton qu'ES sauvegarde, indexe et vérifie par rapport aux requêtes de recherche? ainsi, ne chercherait-il pas à "se battre" en utilisant l'analyseur standard, retournerait quand même une correspondance, si le texte était indexé à l'aide de l'analyseur de boule de neige? – Felix

Questions connexes