2015-01-12 6 views
4

내가 가지고는 에 대한 [email protected]ElasticSearch 일치 쿼리가 모든 결과를 반환하는 이유는 무엇입니까?

"query": { 
    "bool": { 
    "must": [ 
     { 
     "match": { 
      "email": "[email protected]" 
     } 
    } 
    ] 
} 

}

매핑 동일 어디가 이메일 필드에 일치하는 항목을 모두 반환 생각 다음 ElasticSearch 쿼리 사용자이 검색되는 유형은 다음과 같습니다.

{ 
     "users": { 
     "mappings": { 
     "user": { 
      "properties": { 
       "email": { 
        "type": "string" 
       }, 
       "name": { 
        "type": "string", 
        "fields": { 
        "raw": { 
         "type": "string", 
         "index": "not_analyzed" 
        } 
        } 
       }, 
       "nickname": { 
        "type": "string" 
       }, 
      } 
     } 
     } 
    } 
    } 
다음 6,는

결과의 샘플은 위의 쿼리에서

[{ 
    "_index": "users", 
    "_type": "user", 
    "_id": "54b19c417dcc4fe40d728e2c", 
    "_score": 0.23983537, 
    "_source": { 
    "email": "[email protected]", 
    "name": "John Smith", 
    "nickname": "jsmith", 
}, 
{ 
    "_index": "users", 
    "_type": "user", 
    "_id": "9c417dcc4fe40d728e2c54b1", 
    "_score": 0.23983537, 
    "_source": { 
     "email": "[email protected]", 
     "name": "Walter White", 
     "nickname": "wwhite", 
}, 
{ 
    "_index": "users", 
    "_type": "user", 
    "_id": "4fe40d728e2c54b19c417dcc", 
    "_score": 0.23983537, 
    "_source": { 
     "email": "[email protected]", 
     "name": "Jimmy Fallon", 
     "nickname": "jfallon", 
}] 

ElasticSearch

에서 반환, 난이 이메일 속성 값으로 ' [email protected]'와 정확히 일치를해야합니다 생각합니다.

전자 메일에 정확히 일치하는 항목 만 반환하려면 ElasticSearch DSL 쿼리를 어떻게 변경해야합니까?

답변

9

전자 메일 필드가 토큰 화되었으므로이 문제가 발생합니다. 당신이 myemail 검색 또는 gmail.com 당신이 얻을 것이다 경우

"[email protected]"=> [ "myemail", "gmail.com"]

이 방법을 색인 할 때 무슨 일이 있었 그래서 입니다 성냥 권리. 그러면 [email protected]을 검색하면 분석기가 검색 쿼리에도 적용됩니다. 따라서 가 그것

"[email protected]"=>로 나누어 얻는다 [ "존", "gmail.com"]

로서 여기

"gmail.com"토큰 검색어 및 인덱싱 용어를 일반적인 , 당신은 성냥을 얻을 것이다.

이 동작을 극복하려면 전자 메일을 선언하십시오. 필드를 not_analyzed로 지정하십시오. 거기에 토큰 화가 일어나지 않을 것이고 전체 문자열은 그와 같이 색인이 생성됩니다. 와

는 "not_analyzed"

"[email protected]"=> [ "[email protected]"]

그래서 이것에 매핑을 수정하고 당신이 잘되어야합니다 -

{ 
    "users": { 
    "mappings": { 
     "user": { 
     "properties": { 
      "email": { 
      "type": "string", 
      "index": "not_analyzed" 
      }, 
      "name": { 
      "type": "string", 
      "fields": { 
       "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
       } 
      } 
      }, 
      "nickname": { 
      "type": "string" 
      } 
     } 
     } 
    } 
    } 
} 

나는이 문제를보다 정확하게 설명하고 해결하기위한 또 다른 방법은 here입니다.

+0

감사합니다. 완벽하게 작동했습니다. – TheJediCowboy

관련 문제