2015-03-30 20 views
6

EDYCJA: Aby dodać do tego, synonimy wydają się pracować z podstawowymi kwerendami zapytania.Analizator synonimów Elasticsearch nie działa

"query_string" : { 
    "default_field" : "location.region.name.raw", 
    "query" : "nh" 
} 

Powoduje wyświetlenie wszystkich wyników dla New Hampshire, ale zapytanie "dopasowanie" dla "nh" nie zwraca żadnych wyników.


Próbuję dodać synonimy do moich polach lokalizacji w moim Elastic indeksu, tak, że jeśli do wyszukiwania lokalizacji dla „masa”, „Ma” lub „Massachusetts” Wezmę to samo wyniki za każdym razem. Dodałem filtr synonimów do moich ustawień i zmieniłem mapowanie dla lokalizacji. Oto moje ustawienia:

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" 
     ] 
    } 
} 

a mapowanie na polu location.region:

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

Ale analizator synonimami nie wydaje się być cokolwiek. To zapytanie na przykład:

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

ta zwraca setki wyników, ale jeśli mogę zastąpić „Massachusetts” z „ma” lub „Mszy” otrzymuję 0 wyników. Dlaczego to nie działa?

Odpowiedz

10

Kolejność filtrów jest

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

Tak więc, jeśli elasticsearch jest „lowercasing” pierwsze tokeny, gdy wykonuje on drugim etapie, synonym_filter, to nie pasuje do żadnego z wpisów zostały zdefiniowane .

Aby rozwiązać ten problem, chciałbym zdefiniować synonimy małymi literami

+0

Chcę zadać pytanie dotyczące mechanizmu pracy filtrów. Jak działają filtry w analizatorze? W tym przykładzie praca z małymi literami oraz zwrotne tokeny i tokeny są wykonywane przez synonym_filter, a synonym_filter działa i zwraca nowe przefiltrowane tokeny. Czy ten scenariusz jest właściwy, czy jak? – hkulekci

+0

Tak, opisywany scenariusz jest właściwy :) Ogólnie rzecz biorąc, uruchamiany jest tokenizer (w tym przypadku standardowy tokenizer), a następnie filtry tokenów w zdefiniowanej kolejności (w tym przypadku pierwsza mała, a następnie synonim_filter). Dokumentacja wyjaśnia to całkiem dobrze http://www.elastic.co/guide/en/elasticsearch/reference/1.5/analysis-analyzers.html – moliware

+0

ok, dziękuję. Czytam je :) Chcę się upewnić. – hkulekci

0

Można również zdefiniować filtr synonimy jako wielkość liter ma znaczenie:

 

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