2014-11-13 3 views
8

그래서 나는 형식의 값을 저장하는 필드가 있습니다 ... number/year을 2천14분의 23과 같이, 2,014분의 24, 2천15분의 12 등 elasticsearch의 동일한 필드에서 정확한 값과 일치하는 쿼리를 만드는 방법은 무엇입니까?

그래서이 필드는 not_analyzed 하나로 매핑되는 경우, 내가 정확한 구조 (정확히는 1/2014, 15/2014, ...와 같은 값)를 검색하면 용어 필터로 정확한 값 검색을 할 수 있습니다. sql equals(=)처럼 작동합니다.

{ 
    "query": { 
    "filtered": { 
     "filter": { 
     "term": { 
      "processNumber": "11/2014" 
     } 
     } 
    } 
    } 
} 

그래서 11 /, 또는/2014와 (과) 다른 검색은 히트를 반환하지 않습니다. 이건 괜찮아.

필드를 not_analyzed으로 정의하면 match_phrase 쿼리로 sql LIKE 유형 검색을 할 수 없습니다.

{ 
    "query": { 
    "match_phrase": { 
     "processNumber": "11/201" 
    } 
    } 
} 

이 경우 11,11 /,/2014 또는 2014를 검색하면 조회수가 반환되지만 반환되지는 않습니다. 이 쿼리는 필드가 not_analyzed으로 매핑되지 않은 경우 작동합니다. 그래서 하나 또는 다른 하나를 사용해야하는 것, 문제는 필드가 다른 쿼리에 대한 두 옵션을 모두 지원해야한다는 것입니다. 여기에 뭔가 빠졌습니까?

답변

14

당신은 매핑에 fields 속성을 사용하여 다른 방법으로 같은 분야 processNumber를 분석 할 수 있습니다 : 당신이 ProcessNumber의 분석 unanalyzed 버전을 원하는 경우

예를 들어 매핑은 다음과 같습니다

{ 
    "type_name": { 
     "properties": { 
     "processNumber": { 
      "type": "string", 
      "index": "not_analyzed", 
      "fields": { 
       "analyzed": { 
        "type": "string", 
        "index": "analyzed" 
       } 
      } 
     } 
     } 
    } 
} 

여기서 분석되지 않은 필드는 processNumber과 같이 조회됩니다.

이 용어 201분의 11에 대한

쿼리를 processNumber.analyzed 필드 사용의 분석보기를 참조하려면 등 (11)은 다음과 같습니다

예 필터 :

{ "query" : { "filtered" : { "filter" : { "term" : { "processNumber" : "11/2014" } } } } } 

용어 필터 그것은 검색 문자열을 분석하지 않으므로 입력은이 경우 필드 역전 된 인덱스 (즉, 11/2014 필드)와 일치합니다.

예 Match_Phrase_prefix : 문구의 마지막 기간이 인덱스에서 용어의 접두사 인 경우

{ "query": { "match_phrase_prefix": { "processNumber": "11/201" } } } 

match_phrase_prefix 시도가 확인합니다. 분석기가 지정되면 검색 문자열을 분석합니다. 이것이 분석되지 않은 버전의 필드를 사용해야하는 이유입니다. 우리가 processNumber를 사용한다면.

{ "query": { "match": { "processNumber.analyzed": "11" } } } 

이 (보통 표준 분석기) 기본 분석기 때문에 정직 match입니다 2,014분의 11을 토큰 화하는 것입니다 : | 같은 같은 분석 검색 쿼리는 11-201, 11

예를 매치 201도 일치합니다 용어 11, 2014.

분석 API를 사용하여 특정 텍스트가 기본 분석기로 어떻게 분석되는지 볼 수 있습니다.

curl -XPOST "http://<machine>/_analyze?text=11/2014" 
+0

감사합니다. 저는 현재 elasticsearch와의 스프링 통합을 사용하고 있는데, 현재 필드가 어떻게 매핑되어 있는지 알려줍니다 : @Field (type = String, index = FieldIndex.not_analyzed) public String processNumber; 여기에 fields 속성을 설정하는 방법이 있는지 모르겠습니다. – Maxrunner

+0

이 좋아 내가이 일을 찾은 것 같아 : = @MultiField ( mainField = @ 필드 (유형 문자열, 인덱스 = FieldIndex.not_analyzed), otherFields = @NestedField (dotSuffix는 = "분석", 유형 = 문자열 색인 = FieldIndex.analyzed) ) 하지만 세 가지 일치 검색어의 차이점을 알려주시겠습니까? – Maxrunner

+1

@Maxrunner가 대답을 편집하여 쿼리에 대한 간략한 설명을 제공합니다. – keety

관련 문제