Elasticsearch Synonym Analyzer not working

EDIT: To add to this, synonyms seem to work with basic querystring queries.

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

This returns all the results for New Hampshire, but the match query for nh does not return results.


I'm trying to add synonyms to the fields of my location in my Elastic index, so if I do a location search for Mass, Ma, or Massachusetts, I get the same results every time. I added a synonym filter to my settings and changed the display of locations. Here are my settings:

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

And displaying the location.region field:

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

But the synonym analyzer does not seem to do anything. This request, for example:

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

This returns hundreds of results, but if I replace Massachusetts with Ma or Mass, I get 0 results. Why doesn't it work?

+6
source share
2 answers

Filter order

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

So, if elasticsearch "lowercase" first means tokens, when it performs the second step, synonym_filter , it will not match any of the entries that you defined.

To solve the problem, I would define synonyms in lower case

+10
source

You can also define the synonym filter as case insensitive:

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

+1
source

Source: https://habr.com/ru/post/984456/


All Articles