2015-03-30 22 views
6

संपादित करें: इस पर जोड़ने के लिए, समानार्थी मूल क्वेरीस्ट्रिंग प्रश्नों के साथ काम कर रहे प्रतीत होते हैं।लोचदार खोज समानार्थी विश्लेषक काम नहीं कर रहा

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

यह न्यू हैम्पशायर के लिए परिणाम के सभी देता है, लेकिन "राष्ट्रीय राजमार्ग" के लिए एक "मैच" क्वेरी कोई परिणाम।


मैं अपने लचीला सूचकांक में मेरे स्थान क्षेत्रों के लिए समानार्थक शब्द को जोड़ने के लिए है, इसलिए है कि अगर मैं "मास", "माँ," या "मैसाचुसेट्स के लिए एक स्थान खोज करते हैं" मैं एक ही मिल जाएगा कोशिश कर रहा हूँ हर बार परिणाम। मैंने अपनी सेटिंग्स में समानार्थी फ़िल्टर जोड़ा और स्थानों के लिए मानचित्रण बदल दिया।

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

और location.region क्षेत्र के लिए मानचित्रण:: यहाँ मेरा सेटिंग कर रहे हैं

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

लेकिन समानार्थी शब्द विश्लेषक कुछ भी करने जा करने के लिए प्रतीत नहीं होता। उदाहरण के लिए यह प्रश्न:

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

इस परिणाम के सैकड़ों देता है, लेकिन अगर मैं "मा" या "मास" के साथ "मैसाचुसेट्स" की जगह मैं 0 परिणाम नहीं। यह क्यों काम नहीं कर रहा है?

उत्तर

10

फिल्टर के आदेश,

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

तो है अगर elasticsearch "lowercasing" पहले टोकन, जब यह दूसरा कदम, synonym_filter कार्यान्वित करता है, यह प्रविष्टियों में आपके द्वारा निर्धारित किसी से मेल नहीं जाएगा ।

समस्या को हल करने के लिए, मैं

+0

मैं फिल्टर का काम तंत्र के बारे में एक सवाल पूछना चाहता हूँ। विश्लेषक में फ़िल्टर कैसे काम करते हैं? इस उदाहरण में, लोअरकेस फिल्टर काम और वापसी टोकन और टोकन synonym_filter द्वारा लिया जाता है, और synonym_filter काम करता है और नए फ़िल्टर किए गए टोकन लौटाता है। क्या यह परिदृश्य सही है या कैसे? – hkulekci

+0

हां, जो परिदृश्य आप वर्णन कर रहे हैं वह सही है :) सामान्य रूप से, टोकनेज़र (इस मामले में मानक टोकनज़र) निष्पादित होता है और फिर परिभाषित क्रम में टोकन फ़िल्टर (इस मामले में पहले लोअरकेस और फिर synonym_filter)। दस्तावेज यह बहुत अच्छा बताता है http://www.elastic.co/guide/en/elasticsearch/reference/1.5/analysis-analyzers.html – moliware

+0

ठीक है धन्यवाद। मैंने उन्हें पढ़ा :) मैं निश्चित करना चाहता हूं। – hkulekci

0

तुम भी केस संवेदी के रूप में अपने समानार्थी शब्द फिल्टर परिभाषित कर सकते हैं लोअर केस में समानार्थी शब्द निर्धारित करना होगा:

 

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

संबंधित मुद्दे