2016-06-30 1 views
1

J'essaie d'utiliser l'analyseur de synonymes lors de l'interrogation et de ne pas obtenir les résultats attendus. Quelqu'un peut-il jeter un peu de lumière là-dessus?Certains synonymes de mots multiples ne fonctionnent pas dans elasticsearch pour les champs imbriqués

Voici ma correspondance pour l'indice:

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

     } 
     } 
    } 
    } 
} 

Le champ de se concentrer sur rsa.answer, qui est le domaine que je suis Interrogation.

Ma cartographie synonyme:

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 

Ma Rechercher:

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

Il montre une bonne Beautician et « Caisse profiles for search query Coiffeur and facturation exécutif but not showing anything for travailleur du bois => charpentier `cas.

Mes résultats de l'analyseur:

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

et pour 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 
    } 
    ] 
} 

Il est également ne fonctionne pas quelques autres cas.

Mon analyseur de réglage pour index:

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

Répondre

0

Pour le cas ci-dessus un multi-match est plus idéal que chaîne de requête. La correspondance multiple contrairement à la chaîne de requête ne marque pas les termes de la requête avant de l'analyser. Par conséquent, les synonymes composés de plusieurs mots peuvent ne pas fonctionner comme prévu.

Exemple:

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

Si pour une raison quelconque, vous préférez chaîne de requête, vous aurez alors besoin de passer toute requête dans les guillemets doubles pour assurer qu'il ne tokenisé:

exemple:

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

Merci @keety, c'était utile. –

+0

Est-il nécessaire de donner ** rsa.answer ** dans ** champs ** si nous avons déjà donné ** chemin ** comme ** rsa **? –