2013-03-12 4 views
0

나는 elasticsearch 쿼리에 와일드 카드를 사용하지 말아야한다는 것을 최근에 발견했습니다. 대신, 나는 ngram을 사용해야한다고 들었다. 내 실험에서, 이것은 정말로 잘 돌아갔다. 내가하고 싶은 것은 모든 매핑 된 필드 (또는 특정 patern에 맞는 매핑 된 속성)에 대해 ngrams를 사용하도록 Elasticsearch에 알릴 수 있습니다. 예를 들어 :미리 정의 된 스키마없이 와일드 카드 대신 ngram 사용

이제
CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{ 
    "mappings": { 
     "person": { 
      "properties": { 
       "name": { 
        "type": "string", 
        "analyzer": "partial" 
       } 
      } 
     } 
    }, 
    "settings": { 
     "analysis": { 
      "filter": { 
       "lb_ngram": { 
        "max_gram": 10, 
        "min_gram": 1, 
        "type": "nGram" 
       } 
      }, 
      "analyzer": { 
       "partial": { 
        "filter": [ 
         "standard", 
         "lowercase", 
         "asciifolding", 
         "lb_ngram" 
        ], 
        "type": "custom", 
        "tokenizer": "standard" 
       } 
      } 
     } 
    } 
}' 

,이 매핑을 추가 할 때 :

CURL -XPUT 'http://localhost:9200/test-ngram-7/person/1' -d '{ 
"name" : "Cobb", 
"age" : 31 
}' 

내가 쉽게 "OBB"쿼리 및 부분적인 결과를 얻을 수 있습니다. 내 앱에서는 사람들이 매핑 할 분야를 미리 알지 못합니다. 나는이 클라이언트 측에서하고 문서를 게시하기 전에 내 매핑을 선언 분명히 단락 수,하지만 난 이런 식으로 뭔가 할 수 있다면 정말 멋진 것 : 나는 "기본을 사용하고

CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{ 
    "mappings": { 
     "person": { 
      "properties": { 
       "_default_": { 
        "type": "string", 
        "analyzer": "partial" 
       } 
      } 
     } 
    }, 
    "settings": { 
     "analysis": { 
      "filter": { 
       "lb_ngram": { 
        "max_gram": 10, 
        "min_gram": 1, 
        "type": "nGram" 
       } 
      }, 
      "analyzer": { 
       "partial": { 
        "filter": [ 
         "standard", 
         "lowercase", 
         "asciifolding", 
         "lb_ngram" 
        ], 
        "type": "custom", 
        "tokenizer": "standard" 
       } 
      } 
     } 
    } 
}' 

주 ". "name. *"처럼 할 수 있다면 멋질 것입니다. 이름으로 시작하는 모든 속성은이 방법으로 필터링됩니다. 나는 elasticsearch가 디폴트 인과 와일드 카드를 지원한다는 것을 알고 있습니다. *, 그래서 나는 그것을 잘못하고 있기를 바라고 있습니다.

간략히 말하자면 매핑을 만들 때 이 자동으로으로 생성되면 ngram 필터를 통해 새 속성을 실행하고 싶습니다.

답변

1

dynamic_template을 설정할 수 있습니다 (정보는 http://www.elasticsearch.org/guide/reference/mapping/root-object-type.html 참조).

이것을 사용하면 일치 여부, 패턴 일치 등을 기반으로 사용자가 알 수없는 필드 매핑 템플릿을 만들고 이러한 템플릿에 분석기 등을 적용 할 수 있습니다. 이렇게하면 기본 분석기를 설정하는 것과 비교하여 동작을보다 세부적으로 제어 할 수 있습니다.기본 분석기는 일반적으로 "소문자"및 "asciifolding"과 같은 기본 항목에 사용되어야하지만, 모든 필드에 대해 nGram을 적용하는 것이 확실한 경우에는 확실히 유효한 방법입니다.

+0

감사합니다. 패턴에 대한 유용한 정보. – eric

0

그래서 제가 발견 한 한 가지 해결책은 "기본"분석기를 설정하는 것입니다. 문서 설명 :

기본 분석기 분석기는 논리 이름으로 등록됩니다. 그런 다음 은 매핑 정의 또는 특정 API에서 참조 할 수 있습니다. 이 정의되지 않은 경우 기본값이 사용됩니다. 을 정의하는 옵션이 있습니다. 분석기가 파생되지 않을 때 기본적으로 사용됩니다.

기본 논리 이름을 사용하면 이 색인 생성 및 검색 API 모두에 사용될 분석기를 구성 할 수 있습니다. default_index 논리적 이름을 사용하여 인덱싱 할 때 이라는 기본 분석기를 구성하고 default_search를 사용하여 검색 할 때만 사용되는 기본 분석기를 구성 할 수 있습니다. 나는 이것이 "올바른"방식 인 경우 여전히 관심이 있기 때문에 내 자신의 질문에 대답

CURL -XGET 'http://localhost:9200/test-ngram-7/person/_search' -d '{ 
    "query": 
{ 
    "match" : { 
     "name" : "obb" 
    } 
} 
}' 

:

CURL -XPUT 'http://localhost:9200/test-ngram-7/' -d '{ 

    "settings": { 
     "analysis": { 
      "filter": { 
       "lb_ngram": { 
        "max_gram": 10, 
        "min_gram": 1, 
        "type": "nGram" 
       } 
      }, 
      "analyzer": { 
       "default": { 
        "filter": [ 
         "standard", 
         "lowercase", 
         "asciifolding", 
         "lb_ngram" 
        ], 
        "type": "custom", 
        "tokenizer": "standard" 
       } 
      } 
     } 
    } 
}' 

그리고이 쿼리가 작동합니다 : 여기

은 예입니다 이 작업을 수행.