2015-03-30 50 views
6

DÜZENLEME: Buna eklemek için, eş anlamlılar temel sorgulama sorguları ile çalışıyor gibi görünüyor.Elasticsearch eşanlamlı analizör çalışmıyor

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

Bu, New Hampshire için tüm sonuçları döndürür, ancak "nh" için "eşleşme" sorgusu sonuç döndürmez.


ben "Mass", "Ma" veya "Massachusetts için bir yer arama yaparsanız" Aynı alırsınız, böylece benim Elastik endekste konumum alanlarına eş anlamlılarını eklemek çalışıyorum her seferinde sonuç verir. Eşanlamlı filtreyi ayarlarıma ekledim ve konumlar için eşlemeyi değiştirdim.

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

Ve location.region alan için haritalama: İşte benim ayarlardır

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

Ama eş analizörü şey yapıyor gibi görünmüyor. örneğin Bu sorgu:

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

Bu sonuçların yüzlerce döndürür, ancak ben "Ma" ya da "Mass" ile "Massachusetts" yerine eğer 0 sonuç almak. Neden çalışmıyor? elasticsearch "lowercasing" İlk jetonlar, ikinci adımı, synonym_filter çalıştırdığında tanımladığınız girişlerin herhangi maç olmayacak ise

cevap

10

filtrelerin sırası,

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

Yani olduğunu .

Ben

+0

Ben filtrelerin çalışma mekanizması hakkında bir soru sormak istiyorum. Filtreler analizde nasıl çalışır? Bu örnekte, küçük harfli filtre çalışması ve döndürme jetonları ve jetonları synonym_filter tarafından alınmıştır ve synonym_filter çalışır ve yeni filtrelenmiş jetonları döndürür. Bu senaryo doğru mu, nasıl? – hkulekci

+0

Evet, anlatmakta olduğunuz senaryo doğrudur :) Genel olarak, belirteci (bu durumda, standart belirteci) çalıştırılır ve sonra da tanımlanmış sıraya göre filtreler belirtilir (bu durumda, önce küçük harf ve ardından synonym_filter). Dokümantasyon oldukça iyi açıklıyor http://www.elastic.co/guide/en/elasticsearch/reference/1.5/analysis-analyzers.html – moliware

+0

tamam teşekkür ederim. Onları okudum :) Emin olmak istiyorum. – hkulekci

0

Ayrıca duyarsız durumda olarak eş filtreyi tanımlayabilirsiniz küçük harflerle eş anlamlılarını tanımlayacak, sorunu çözmek için:

 

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