2016-06-30 2 views
1

쿼리 시간에 동의어 분석기를 사용하여 예상 결과를 얻지 못했습니다. 누군가 이것에 약간의 빛을 던질 수 있습니까?중첩 된 필드에 대한 elasticsearch에서 일부 다중 단어 동의어가 작동하지 않습니다.

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

     } 
     } 
    } 
    } 
} 

에 초점을 필드가 rsa.answer입니다, 내가 질의하고있는 필드 :

다음은 인덱스 내 매핑입니다.

내 동의어 매핑 :

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 

내 검색 쿼리 :

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

그것은이 표시되어 캐셔 'Beautician 적절하고 profiles for search query 헤어 드레서 and 청구 임원 but not showing anything for 나무 노동자 => 목수 케이스.

내 분석 결과 :

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

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

에 대한 그것은 또한 몇 가지 다른 경우 작동하지 않습니다. 인덱스 설정을

내 분석기 : 하나 multi-match 쿼리 문자열보다 더 이상적입니다 위의 경우를 들어

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

답변

0

. 다중 일치 쿼리 문자열과 달리 쿼리 용어를 분석하기 전에 토큰 화하지 않습니다. 따라서 여러 단어 동의어가 예상대로 작동하지 않을 수 있습니다.

예 :

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

어떤 이유로 당신은 당신이이 토큰 화되지 않도록하기 위해 큰 따옴표로 전체 쿼리를 전달할 필요가 쿼리 문자열을 선호하는 경우 :

예 :

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

감사합니다. 도움이되었습니다. –

+0

이미 ** 경로 ** ** rsa **를 부여한 경우 ** 필드 **에서 ** rsa.answer **을 제공해야합니까? –

관련 문제