2017-04-17 4 views
0

에서 사용자 정의 분석기 키워드 문자열 형식을 만듭니다 "->"샌프란시스코 ","보스턴 ","뉴욕 "나는 키워드 형식으로 인덱스에 있지만 특별한 쉼표 분석기 싶은 문자열이 5.3.0

은 동시에 인덱싱 및 집계가 가능해야하므로 버킷으로 나눌 수 있습니다. 5.0.0 이전 버전에서는 다음 작업이 수행되었습니다. 색인 설정 :

{ 
    'settings': { 
     'analysis': { 
      'tokenizer': { 
       'comma': { 
        'type': 'pattern', 
        'pattern': ',' 
       } 
      }, 
      'analyzer': { 
       'comma': { 
        'type': 'custom', 
        'tokenizer': 'comma' 
       } 
      } 
     }, 
    }, 
} 

llowing 매핑 : 5.3.0 및 분석기 위의 지금

{ 
    'city': { 
     'type': 'string', 
     'analyzer': 'comma' 
    }, 
} 

더 이상 키워드 유형에 대한 유효한 속성입니다 없으며, 나의 이해는 내가 여기에 keyword 유형을 원하는 것입니다. 맞춤 분석기로 집계 가능하고 색인 생성 된 검색 가능한 텍스트 유형을 어떻게 지정합니까?

+0

'keyword' 필드는 이제 [normalizers (https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-normalizers.html) 수, 하지만 그것들은 특정 토큰 필터와 char 필터를 사용하지만 토큰 화 프로그램은 사용하지 않으므로 접근 방법이 아닙니다. ES로 보내기 전에 클라이언트 측에서 해당 문자열을 분할 할 방법이 있습니까? – Val

답변

1

multifields을 사용하면 동일한 필드를 검색 및 집계를위한 두 가지 다른 방법으로 인덱싱 할 수 있습니다.

또한 trim에 필터를 추가하고 더 나은 검색을 돕기 위해 생성 된 토큰을 소문자로 사용하는 것이 가장 좋습니다.

매핑

PUT commaindex2 
    { 
     "settings": { 
      "analysis": { 
       "tokenizer": { 
        "comma": { 
         "type": "pattern", 
         "pattern": "," 
        } 
       }, 
       "analyzer": { 
        "comma": { 
         "type": "custom", 
         "tokenizer": "comma", 
         "filter": ["lowercase", "trim"] 
        } 
       } 
      } 
     }, 
     "mappings": { 
      "city_document": { 
       "properties": { 
        "city": { 
         "type": "keyword", 
         "fields": { 
          "city_custom_analyzed": { 
           "type": "text", 
           "analyzer": "comma", 
           "fielddata": true 
          } 
         } 
        } 
       } 
      } 
     } 
    } 

색인 문서

POST commaindex2/city_document 
{ 
    "city" : "san fransisco, new york, london" 
} 

검색 쿼리

POST commaindex2/city_document/_search 
{ 
    "query": { 
     "bool": { 
      "must": [{ 
       "term": { 
        "city.city_custom_analyzed": { 
         "value": "new york" 
        } 
       } 
      }] 
     } 
    }, 
    "aggs": { 
     "terms_agg": { 
      "terms": { 
       "field": "city", 
       "size": 10 
      } 
     } 
    } 
} 

참고

인덱싱 된 필드에서 aggs를 실행하려는 경우 버킷의 각 도시를 계산할 때와 마찬가지로 city.city_custom_analyzed 필드에서 집계를 실행할 수 있습니다.

POST commaindex2/city_document/_search 
{ 
    "query": { 
     "bool": { 
      "must": [{ 
       "term": { 
        "city.city_custom_analyzed": { 
         "value": "new york" 
        } 
       } 
      }] 
     } 
    }, 
    "aggs": { 
     "terms_agg": { 
      "terms": { 
       "field": "city.city_custom_analyzed", 
       "size": 10 
      } 
     } 
    } 
} 

희망이

+0

'city' 필드에서 집계 조건을 실행할 때 어떻게됩니까? 당신은 아마도 각 도시를 따로 얻지 못할 것입니다, 그렇죠? – Val

+0

예, 그는 대신 city.city_custom_analyzed 필드에서 실행할 수 있습니다. 그는 집계를 실행할 곳을 명확히 언급하지 않았습니다. 그렇다면 왜 키워드가 필요한지, 맞춤 분석기를 적용하고 다단계를 피할 수 있습니다. 그 사람까지 그는 모든 분야를 선택할 수 있습니다. 나는 그 소식을 업데이트 할 것이다. 덕분에 – user3775217

1

은 ES 5.3을 사용하고 있기 때문에, 나는 인덱싱 시간에 필드를 분할하는 인제 스트 파이프 라인을 사용하여, 다른 접근 방법을 제시하는 데 도움이됩니다.

PUT _ingest/pipeline/city-splitter 
{ 
    "description": "City splitter", 
    "processors": [ 
    { 
     "split": { 
     "field": "city", 
     "separator": "," 
     } 
    }, 
    { 
     "foreach": { 
     "field": "city", 
     "processor": { 
      "trim": { 
      "field": "_ingest._value" 
      } 
     } 
     } 
    } 
    ] 
} 

그런 다음 인덱스 새 문서 수 :

PUT cities/city/1?pipeline=city-splitter 
{ "city" : "San Francisco, Boston, New York" } 

그리고 마지막으로 당신은/종류에 city를 검색하고 도시가 클라이언트 응용 프로그램에서 분리 된 것처럼 현장 city.keyword에 집계를 실행할 수 있습니다 :

5.2 이상에서
POST cities/_search 
{ 
    "query": { 
    "match": { 
     "city": "boston" 
    } 
    }, 
    "aggs": { 
    "cities": { 
     "terms": { 
     "field": "city.keyword" 
     } 
    } 
    } 
} 
+0

행운이? – Val