0

나는 현재 수행중인 간단한 사용자 검색을 위해 ElasticSearch API로 프록시 처리하는 끝점이 있습니다.ElasticSearch MultiField 검색 쿼리

/users?nickname=myUsername&[email protected]&name=John+Smith 

이러한 매개 변수에 대한 SOMET 세부 사항은 모든 매개 변수가가 ('MyUserName 에다'를 반환 즉 '참고 MyUser') 전체 텍스트 검색으로 검색 할 수있는 선택

  • 별명이다

    • 를 따르고 있습니다
    • 이메일은 정확히 일치해야합니다.
    • 이름은 각 토큰에 대한 전체 텍스트 검색으로 검색 할 수 있습니다 (예 : 'John'은 'John Smith'를 반환합니다)

    ElasticSearch 검색 호출은 매개 변수를 AND로 처리해야합니다.

    지금 당장 필자는 각 매개 변수 만 쿼리를 실행할 수 있지만 모두 함께 시작할 수는 없다.

    client.search({ 
        index: 'users', 
        type: 'user', 
        body: { 
         "query": { 
          //NEED TO FILL THIS IN 
         } 
        } 
    }).then(function(resp){ 
        //Do something with search results 
    }); 
    
  • 답변

    4

    먼저이 특정 사용 사례에 대한 매핑을 만들어야합니다.

    curl -X PUT "http://$hostname:9200/myindex/mytype/_mapping" -d '{ 
        "mytype": { 
        "properties": { 
         "email": { 
         "type": "string", 
         "index": "not_analyzed" 
         }, 
         "nickname": { 
         "type": "string" 
         }, 
         "name": { 
         "type": "string" 
         } 
        } 
        } 
    }' 
    

    여기서는 이메일을 not_analyzed로 설정하여 정확하게 일치하는 것을 확인합니다. 완료되면 쿼리를 만들어야합니다. 여러 조건이 있으므로 bool 쿼리를 사용하는 것이 좋습니다. 여러 쿼리를 결합 할 수 있습니다 및

    쿼리 부울 쿼리를 사용하여 처리하는 방법 - 토큰이 QBO로 시작하더라도

    { 
        "query": { 
        "bool": { 
         "must": [ 
         { 
          "match": { 
          "name": "qbox" 
          } 
         }, 
         { 
          "prefix": { 
          "nickname": "qbo" 
          } 
         }, 
         { 
          "match": { 
          "email": "[email protected]" 
          } 
         } 
         ] 
        } 
        } 
    } 
    

    접두사 쿼리를 사용하면 Elasticsearch을 말하고있다, 일치로 자격이 있음 .

    프리픽스 쿼리가 매우 빠르지 않을 수도 있습니다.이 경우 ngram analyzer - http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-ngram-tokenizer.html