2012-11-15 4 views
2

Je suis nouveau à Elasticsearch et j'ai un problème concernant l'interrogation.Elasticsearch ignore les séparateurs de mots

I indexées chaînes comme ça:

my-super-string 
my-other-string 
my-little-string 

Ce sont les chaînes limaces. Donc, ce ne sont pas des espaces, seulement des caractères alphanumériques. Le mappage pour le champ associé est uniquement "type = chaîne".

J'utilise une requête comme ceci:

{ "query":{ "query_string":{ "query": "*"+<MY_QUERY>+"*", "rewrite": "top_terms_10" } }} 

Où "my_query" est aussi une limace. Quelque chose comme "mon-super" par exemple. Lorsque vous recherchez "mon", j'obtiens des résultats.

Lorsque vous recherchez "my-super" je n'obtiens aucun résultat et j'aimerais avoir "my-super-string".

Quelqu'un peut-il m'aider à ce sujet? Merci!

Répondre

1

Je suggère d'utiliser match_phrase au lieu d'utiliser une chaîne de requête avec des caractères génériques de début et de fin. Même l'analyseur standard devrait être en mesure de diviser correctement le slug en jetons, il n'y a donc pas besoin de jokers.

curl -XPUT "localhost:9200/slugs/doc/1" -d '{"slug": "my-super-string"}' 
echo 
curl -XPUT "localhost:9200/slugs/doc/2" -d '{"slug": "my-other-string"}' 
echo 
curl -XPUT "localhost:9200/slugs/doc/3" -d '{"slug": "my-little-string"}' 
echo 
curl -XPOST "localhost:9200/slugs/_refresh" 
echo 
echo "Searching for my" 
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my"} } }' 
echo 
echo "Searching for my-super" 
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my-super"} } }' 
echo 
echo "Searching for my-other" 
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my-other"} } }' 
echo 
echo "Searching for string" 
curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "string"} } }' 

Vous pouvez également créer votre propre analyseur qui va diviser les limaces en jetons que sur « - »

curl -XDELETE localhost:9200/slugs 
curl -XPUT localhost:9200/slugs -d '{ 
    "settings": { 
     "index": { 
      "number_of_shards": 1, 
      "number_of_replicas": 0, 
      "analysis": { 
       "analyzer" : { 
        "slug_analyzer" : { 
         "tokenizer": "slug_tokenizer", 
         "filter" : ["lowercase"] 
        } 
       }, 
       "tokenizer" :{ 
        "slug_tokenizer" : { 
         "type": "pattern", 
         "pattern": "-" 
        } 
       } 
      } 
     } 
    }, 
    "mappings" :{ 
     "doc" : { 
      "properties" : { 
       "slug" : {"type": "string", "analyzer" : "slug_analyzer"} 
      } 
     } 
    } 
}' 
+0

Bonjour imotov et merci pour votre réponse. – Vinc

+0

Avec le match_phrase je dois avoir une correspondance exacte pour avoir des résultats. J'ai donc essayé le match_phrase_prefix, ça marche bien, mais j'ai aussi besoin d'un "match_phrase_suffix" si je recherche "super-s" je voudrais obtenir "my-super-string". En fait, je voudrais avoir un simple caractère générique comme '* -str *' qui correspondra à n'importe quel slug contenant "-str" C'est le caractère "-" avec lequel j'ai un problème. Chaque fois que j'en avais un à ma question je n'obtiens aucun résultat. – Vinc

+0

Oh, je vois. Alors c'est ceci: http://stackoverflow.com/questions/6467067/how-to-search-for-a-part-of-a-word-with-elasticsearch/6471449#6471449 – imotov

Questions connexes