2016-06-30 8 views
1

Ich versuche, Synonymanalysator zur Abfragezeit zu verwenden und nicht die erwarteten Ergebnisse zu erhalten. Kann jemand etwas Licht darauf werfen?Einige Multiwort-Synonyme funktionieren nicht in Elasticsearch für verschachtelte Felder.

Hier ist mein Mapping für den Index:

{ 
    "jobs_user_profile_v2": { 
    "mappings": { 
     "profile": { 
     "_all": { 
      "enabled": false 
     }, 
     "_ttl": { 
      "enabled": true 
     }, 
     "properties": { 

      "rsa": { 
      "type": "nested", 
      "properties": { 
       "answer": { 
       "type": "string", 
       "index_analyzer": "autocomplete", 
       "search_analyzer": "synonym", 
       "position_offset_gap": 100 
       }, 
       "answerId": { 
       "type": "long" 
       }, 
       "answerOriginal": { 
       "type": "string", 
       "index": "not_analyzed" 
       }, 
       "createdAt": { 
       "type": "long" 
       }, 
       "label": { 
       "type": "string", 
       "index": "not_analyzed" 
       }, 
       "labelOriginal": { 
       "type": "string", 
       "index": "not_analyzed" 
       }, 
       "question": { 
       "type": "string", 
       "index": "not_analyzed" 
       }, 
       "questionId": { 
       "type": "long" 
       }, 
       "questionOriginal": { 
       "type": "string" 
       }, 
       "source": { 
       "type": "integer" 
       }, 
       "updatedAt": { 
       "type": "long" 
       } 
      } 
      } 

     } 
     } 
    } 
    } 
} 

Das Feld zu konzentrieren, ist rsa.answer, die das Feld I Abfrage bin.

Mein Synonym Mapping:

Beautician,Stylist,Make up artist,Massage therapist,Therapist,Spa,Hair Dresser,Salon,Beauty Parlour,Parlor => Beautician 
Carpenter,Wood Worker,Furniture Carpenter => Carpenter 
Cashier,Store Manager,Store Incharge,Purchase Executive,Billing Executive,Billing Boy => Cashier 
Content Writer,Writer,Translator,Writing,Copywriter,Content Creation,Script Writer,Freelance Writer,Freelance Content Writer => Content Writer 

Meine Suchanfrage:

http://{{domain}}/jobs_user_profile_v2/_search 

{ 
    "query": { 
     "nested":{ 
      "path": "rsa", 
      "query":{ 
    "query_string": { 
     "query": "hair dresser", 
     "fields": ["answer"], 
     "analyzer" :"synonym" 



    } 
    }, 
    "inner_hits": { 
      "explain": true 
     } 

    } 
    }, 
    "explain" : true, 
    "sort" : [ { 
    "_score" : { } 
    } ] 
} 

Es ist profiles for search query Frisör and Abrechnung Executive but not showing anything for Holzarbeiter => Tischler richtige Beautician und ‚Kasse zeigt `Fall.

Meine Analyseergebnisse:

http://{{domain}}/jobs_user_profile_v2/_analyze?analyzer=synonym&text=hair dresser 


{ 
    "tokens": [ 
    { 
     "token": "beautician", 
     "start_offset": 0, 
     "end_offset": 12, 
     "type": "SYNONYM", 
     "position": 1 
    } 
    ] 
} 

und für wood worker case

http://{{domain}}/jobs_user_profile_v2/_analyze?analyzer=synonym&text=wood worker 


{ 
    "tokens": [ 
    { 
     "token": "carpenter", 
     "start_offset": 0, 
     "end_offset": 11, 
     "type": "SYNONYM", 
     "position": 1 
    } 
    ] 
} 

Es funktioniert auch nicht ein paar andere Fälle.

Mein Analysator für die Indexeinstellung:

"analysis": { 
      "filter": { 
      "synonym": { 
       "ignore_case": "true", 
       "type": "synonym", 
       "synonyms_path": "synonym.txt" 
      }, 
      "autocomplete_filter": { 
       "type": "edge_ngram", 
       "min_gram": "3", 
       "max_gram": "10" 
      } 
      }, 
      "analyzer": { 
      "text_en_splitting_search": { 
       "type": "custom", 
       "filter": [ 
       "stop", 
       "lowercase", 
       "porter_stem", 
       "word_delimiter" 
       ], 
       "tokenizer": "whitespace" 
      }, 
      "synonym": { 
       "filter": [ 
       "stop", 
       "lowercase", 
       "synonym" 
       ], 
       "type": "custom", 
       "tokenizer": "standard" 
      }, 
      "autocomplete": { 
       "filter": [ 
       "lowercase", 
       "autocomplete_filter" 
       ], 
       "type": "custom", 
       "tokenizer": "standard" 
      }, 
      "text_en_splitting": { 
       "filter": [ 
       "lowercase", 
       "porter_stem", 
       "word_delimiter" 
       ], 
       "type": "custom", 
       "tokenizer": "whitespace" 
      }, 
      "text_general": { 
       "filter": [ 
       "lowercase" 
       ], 
       "type": "custom", 
       "tokenizer": "standard" 
      }, 
      "edge_ngram_analyzer": { 
       "filter": [ 
       "lowercase" 
       ], 
       "type": "custom", 
       "tokenizer": "edge_ngram_tokenizer" 
      }, 
      "autocomplete_analyzer": { 
       "filter": [ 
       "lowercase" 
       ], 
       "tokenizer": "whitespace" 
      } 
      }, 
      "tokenizer": { 
      "edge_ngram_tokenizer": { 
       "token_chars": [ 
       "letter", 
       "digit" 
       ], 
       "min_gram": "2", 
       "type": "edgeNGram", 
       "max_gram": "10" 
      } 
      } 
     } 

Antwort

0

Für den obigen Fall ein multi-match idealere als Abfrage-String ist. Im Gegensatz zu einer Abfragezeichenfolge multi-Match werden die Abfragebegriffe vor der Analyse nicht in Token umgewandelt. Als Folge können Mehrwort-Synonyme möglicherweise nicht wie erwartet funktionieren.

Beispiel:

{ 
    "query": { 
     "nested": { 
     "path": "rsa", 
     "query": { 
      "multi_match": { 
       "query": "wood worker", 
       "fields": [ 
        "rsa.answer" 
       ], 
       "type" : "cross_fields", 
       "analyzer": "synonym" 
      } 
     } 
     } 
    } 
} 

Wenn aus irgendeinem Grunde bevorzugen Sie Abfrage-String dann würden Sie die gesamte Abfrage in doppelten Anführungszeichen passieren müssen, um sicherzustellen, dass es nicht in Token aufgeteilt wird:

Beispiel:

post test/_search 
{ 
    "query": { 
     "nested": { 
     "path": "rsa", 
     "query": { 
      "query_string": { 
       "query": "\"wood worker\"", 
       "fields": [ 
        "rsa.answer" 
       ], 
       "analyzer": "synonym" 
      } 
     } 
     } 
    } 
} 
+0

Dank @keety, es war hilfreich. –

+0

Ist es notwendig, ** rsa.answer ** in ** Feldern ** anzugeben, wenn wir ** ** ** ** als ** rsa ** angegeben haben? –

Verwandte Themen