2017-11-29 1 views
0

탄성 검색에서 데이터를 검색하려고합니다. 나는 elastc 검색에서 데이터를 인덱싱했으며 아래처럼 보입니다.탄성 검색에서 일부 필드 값을 기준으로 데이터 추출

{ 
    "_index": "user", 
    "_type": "user_type", 
    "_id": "2393294", 
    "_version": 1, 
    "_score": 2, 
    "_source": { 
    "name": "shwn decker", 
    "worksFor": { 
     "legalName": "nykc private fund", 
     "address": "Mk street, bruke field" 
    }, 
    }, 
    "fields": { 
    "tweetDate": [ 
     1457481600000 
    ] 
    }, 
    "sample_date":"10/10/2013" 
} 

"name"및 "legalName"필드를 기반으로 데이터를 검색하려고합니다. 몇 가지 쿼리를 시도했지만 두 필드를 기반으로 데이터를 필터링하려고 할 때 어떤 문서도 일치하지 않습니다. 내가 사용 쿼리는 다음과 같습니다

curl -XGET 'localhost:9200/user/user_type/_search?pretty' -H 'Content- Type: application/json' -d' 
{ 
    "query":{ 
     "bool":{ 
     "must":{ 
      "query_string": { 
       "query": "shwn decker", 
      "fields": ["name"] 
      } 
     }, 
     "filter":{ 
      "term":{ 
        "worksFor.legalName":"nykc private fund" 
      } 
     } 
     } 
    } 
}' 

내가 쿼리에서 무엇을해야 수정 나는 결과를 얻을 수 있도록. I는 다음과 같습니다이 데이터에 대한 사용자 정의 매핑을 사용하고 있습니다 :

{ 
    "settings": 
    { 
    "number_of_shards" : 3, 
    "number_of_replicas" : 2 
    }, 
    "mappings" : { 
     "user_type" : { 
     "properties" : { 
      "name" : { 
      "type" : "text", 
      "fields" : { 
        "raw" : { 
        "type":"keyword" 
        } 
     } 
      }, 
      "worksFor" : { 
      "properties" : { 
       "address" : { 
       "type" : "text" 
       }, 
       "legalName" : { 
       "type" : "text", 
       "fields" : { 
        "raw" : { 
        "type":"keyword" 
        } 
     } 
       }, 
      } 
      } 
     } 
     } 
    } 
    }' 
+0

사용중인 ES 버전은 무엇입니까? – mickl

+0

5.5 bool 쿼리를 지원합니다 – neha

+0

데이터를 인덱싱하기 전에 매핑을 정의 했습니까? – mickl

답변

0

난 당신이 데이터를 색인하기 전에 매핑을 정의하지 않았고 모든 필드들이 분석을 의미합니다 텍스트로 색인한다고 가정 . 대신

nykc 민간 자금의

색인이 worksFor.legalName 키에이 문서에 대한 별도의 세 가지 단어가 포함되어 있다는 것을 의미한다.

그러면 terms 필터가 분석되지 않으므로 전체 구문을 한 단어와 비교하고 있습니다. 그것이 결과를 얻지 못하는 이유입니다. 용어 필터링을 계속 수행하려면이 필드를 keyword으로 정의해야합니다.

그럼 적어도 하나의 특정 필드에 대해 색인을 제거하고 매핑을 정의한 다음 다시 색인을 생성해야합니다. 필드에 대한 매핑을 정의하는 방법은 다음과 같습니다.

PUT localhost:9200/user 

{ 
    "mappings": { 
    "user_type": { 
     "properties": { 
     "worksFor.legalName": { 
      "type": "keyword" 
     } 
     } 
    } 
    } 
} 

동일한 쿼리는 문서를 반환해야합니다.

편집 : 위의 모든 내용은 여전히 ​​유효하지만 질문이 편집되고 매핑 정의가 첨부되었습니다. 이러한 매핑을이 있어야한다 :

{ 
"query":{ 
    "bool":{ 
     "must":{ 
      "query_string": { 
       "query": "shwn decker", 
      "fields": ["name"] 
     } 
     }, 
     "filter":{ 
      "term":{ 
       "worksFor.legalName.raw":"nykc private fund" 
      } 
     } 
    } 
} 

}

legalName의 원시 부분은 키워드입니다 때문입니다.

+0

하지만 이미 'legalName'을 내 매핑의 키워드 유형으로 정의하고 있습니다. 위의 매핑을 확인할 수 있습니다. – neha

+0

설명해 주셔서 감사합니다. 문제는 다중 필드 매핑이 있고 legalName이 여전히 텍스트라는 것입니다. 내 예제는 여전히 작동하지만 매핑을 사용하려면 원시 부분이 키워드이므로 worksFor.legalName.raw로 필터 키를 다시 정의해야합니다. – mickl

+0

고마워요. @mickl, worksFor.legalName.raw로 필터를 다시 정의하면 작동합니다. :) – neha

관련 문제