2016-09-02 5 views
0

elasticsearch를 사용하여 "스키"라는 단어로 모든 항목을 찾으십시오.탄성 검색 검색 단어와 모든 동의어를 찾으십시오

내 매핑 (PHP 배열) :

"properties" => [ 
    "title" => [ 
     "type" => "string", 
     "boost" => 1.0, 
     "analyzer" => "autocomplete" 
    ] 
] 

설정 :

"settings"=> [ 
    "analysis" => [ 
     "analyzer" => [ 
      "autocomplete" => [ 
       "type" => "custom", 
       "tokenizer" => "standard", 
       "filter" => ["lowercase", "trim", "synonym", "porter_stem"], 
       "char_filter" => ["html_strip"] 
      ] 
     ], 
     "filter" => [ 
      "synonym" => [ 
       "type" => "synonym", 
       "synonyms_path" => "analysis/synonyms.txt" 
      ] 
     ] 
    ] 
] 

검색 쿼리 다음 sysnonyms.txt에서

[ 
    "index" => "articles", 
    "body" => [ 
     "query" => [ 
      "filtered" => [ 
       "query" => [ 
        "bool" => [ 
         "must" => [ 
          "indices" => [ 
           "indices" => ["articles"], 
           "query" => [ 
            "bool" => [ 
             "should" => [ 
              "multi_match" => [ 
               "query" => "skiing", 
               "fields" => ["title"] 
              ] 
             ] 
            ] 
           ] 
          ] 
         ] 
        ] 
       ] 
      ] 
     ], 
     "sort" => [ 
      "_score" => [ 
       "order" => "desc" 
      ] 
     ] 
    ], 
    "size" => 10, 
    "from" => 0, 
    "search_type" => "dfs_query_then_fetch", 
    "explain" => true 
]; 

스키 => 크 산트 있습니다.

내가 (이 입력 단어이기 때문에) "스키"모든 항목을 얻을 싶다 "스키"와 (동의어 파일로) 다음 "크 산트"(porter_stem 토크 나이로). 그러나 "xanthic"이라는 단어로만 결과를 얻으십시오.

제발, 왜 말해? 어떻게 인덱스를 구성해야합니까?

답변

0

고맙습니다. 그러나 이것은 decision입니다.

"properties" => [ 
    "title" => [ 
     "type" => "string", 
     "boost" => 1.5, 
     "analyzer" => "standard", 
     "fields" => [ 
      "english" => [ 
       "type" => "string", 
       "analyzer" => "standard", 
       "search_analyzer" => "english", 
       "boost" => 1.0 
      ], 
      "synonym" => [ 
       "type" => "string", 
       "analyzer" => "standard", 
       "search_analyzer" => "synonym", 
       "boost" => 0.5 
      ] 
     ] 
    ] 
] 

설정 :

"settings"=> [ 
    "analysis" => [ 
     "analyzer" => [ 
      "synonym" => [ 
       "type" => "custom", 
       "tokenizer" => "standard", 
       "filter" => ["lowercase", "trim", "synonym"], 
       "char_filter" => ["html_strip"] 
      ] 
     ], 
     "filter" => [ 
      "synonym" => [ 
       "type" => "synonym", 
       "synonyms_path" => "analysis/synonyms.txt" 
      ] 
     ] 
    ] 
] 
나는 매핑을 변경
1

동의어 파일에 "skiing, xanthic"이 있어야합니다. 당신이 지금 가지고있는 방식으로 당신은 스키를 황갈색으로 바꾸고 있지만, 당신은 양쪽 모두를 갖고 싶습니다. 그리고 변경 사항을 보려면 데이터를 다시 색인화해야한다고 생각합니다.