2015-03-30 1 views
6

EDIT: Pour ajouter à cela, les synonymes semblent fonctionner avec des requêtes querystring de base. Cela renvoie tous les résultats pour New Hampshire, mais une requête "match" pour "nh" ne renvoie aucun résultat.L'analyseur de synonyme Elasticsearch ne fonctionne pas


Je suis en train d'ajouter des synonymes à mes champs d'emplacement dans mon index élastique, de sorte que si je fais une recherche d'emplacement pour « Mass », « Ma », ou « Massachusetts » Je vais même résultats à chaque fois. J'ai ajouté le filtre de synonymes à mes paramètres et modifié le mappage pour les emplacements. Voici mes paramètres:

analysis":{ 
    "analyzer":{ 
     "synonyms":{ 
      "filter":[ 
       "lowercase", 
       "synonym_filter" 
      ], 
     "tokenizer": "standard" 
    } 
}, 
"filter":{ 
    "synonym_filter":{ 
     "type": "synonym", 
     "synonyms":[ 
      "United States,US,USA,USA=>usa", 
      "Alabama,Al,Ala,Ala", 
      "Alaska,Ak,Alas,Alas", 
      "Arizona,Az,Ariz", 
      "Arkansas,Ar,Ark", 
      "California,Ca,Calif,Cal", 
      "Colorado,Co,Colo,Col", 
      "Connecticut,Ct,Conn", 
      "Deleware,De,Del", 
      "District of Columbia,Dc,Wash Dc,Washington Dc=>Dc", 
      "Florida,Fl,Fla,Flor", 
      "Georgia,Ga", 
      "Hawaii,Hi", 
      "Idaho,Id,Ida", 
      "Illinois,Il,Ill,Ills", 
      "Indiana,In,Ind", 
      "Iowa,Ia,Ioa", 
      "Kansas,Kans,Kan,Ks", 
      "Kentucky,Ky,Ken,Kent", 
      "Louisiana,La", 
      "Maine,Me", 
      "Maryland,Md", 
      "Massachusetts,Ma,Mass", 
      "Michigan,Mi,Mich", 
      "Minnesota,Mn,Minn", 
      "Mississippi,Ms,Miss", 
      "Missouri,Mo", 
      "Montana,Mt,Mont", 
      "Nebraska,Ne,Neb,Nebr", 
      "Nevada,Nv,Nev", 
      "New Hampshire,Nh=>Nh", 
      "New Jersey,Nj=>Nj", 
      "New Mexico,Nm,N Mex,New M=>Nm", 
      "New York,Ny=>Ny", 
      "North Carolina,Nc,N Car=>Nc", 
      "North Dakota,Nd,N Dak, NoDak=>Nd", 
      "Ohio,Oh,O", 
      "Oklahoma,Ok,Okla", 
      "Oregon,Or,Oreg,Ore", 
      "Pennsylvania,Pa,Penn,Penna", 
      "Rhode Island,Ri,Ri & PP,R Isl=>Ri", 
      "South Carolina,Sc,S Car=>Sc", 
      "South Dakota,Sd,S Dak,SoDak=>Sd", 
      "Tennessee,Te,Tenn", 
      "Texas,Tx,Tex", 
      "Utah,Ut", 
      "Vermont,Vt", 
      "Virginia,Va,Virg", 
      "Washington,Wa,Wash,Wn", 
      "West Virginia,Wv,W Va, W Virg=>Wv", 
      "Wisconsin,Wi,Wis,Wisc", 
      "Wyomin,Wi,Wyo" 
     ] 
    } 
} 

Et le mappage pour le champ location.region:

"region":{ 
    "properties":{ 
     "id":{"type": "long"}, 
     "name":{ 
      "type": "string", 
      "analyzer": "synonyms", 
      "fields":{"raw":{"type": "string", "index": "not_analyzed" }} 
     } 
    } 
} 

Mais l'analyseur de synonymes ne semble pas faire quoi que ce soit. Cette requête, par exemple:

"match" : { 
    "location.region.name" : { 
     "query" : "Massachusetts", 
     "type" : "phrase", 
     "analyzer" : "synonyms" 
    } 
} 

Cela renvoie des centaines de résultats, mais si je remplace « Massachusetts » avec « Ma » ou « Mass » je reçois 0. Pourquoi ça ne marche pas?

Répondre

10

L'ordre des filtres est

filter":[ 
    "lowercase", 
    "synonym_filter" 
] 

Donc, si ElasticSearch est « en minuscule » d'abord les jetons, quand il exécute la deuxième étape, synonym_filter, il ne correspond pas à l'une des entrées que vous avez définies .

Pour résoudre le problème, je définirais les synonymes en minuscules

+0

Je veux poser une question sur le mécanisme de travail des filtres. Comment fonctionnent les filtres dans l'analyseur? Dans cet exemple, le travail de filtre en minuscules et les jetons de retour et les jetons sont pris par synonym_filter, et synonym_filter fonctionne et renvoie de nouveaux jetons filtrés. Ce scénario est-il correct ou comment? – hkulekci

+0

Oui, le scénario que vous décrivez est correct :) En général, tokenizer (dans ce cas standard tokenizer) est exécuté, puis filtre les jetons dans l'ordre défini (dans ce cas, minuscule d'abord, puis synonyme_filtre). La documentation l'explique assez bien http://www.elastic.co/guide/fr/elasticsearch/reference/1.5/analysis-analyzers.html – moliware

+0

ok merci. Je les lis :) Je veux m'assurer. – hkulekci

0

Vous pouvez également définir votre filtre synonymes comme insensible à la casse:

 

    "filter":{ 
     "synonym_filter":{ 
      "type": "synonym", 
      "ignore_case" : "true", 
      "synonyms":[ 
       ... 
      ] 
     } 
    }