2017-01-09 2 views
1

Ngram 토크 나이저를 사용 중이고 min_length를 3, max_length를 5로 지정했습니다. 그러나 5보다 큰 단어를 검색해도 여전히 나에게 알려줍니다 그 결과. ES가 길이 6의 조합에 대한 색인을 생성하지 않을지라도 나는 여전히 기록을 검색 할 수 있습니다. 여기에 실종 된 이론이 있습니까? 그렇지 않다면, NGram의 max_length는 실제로 어떤 의미가 있습니까? 나는 '이 시도했다NGram Tokenizer를 사용하는 동안 ElasticSearch가 최대 NGram 길이를 준수하지 않음

GET ngramtest/MyEntity/_search 
{ 
"query": { 
    "match": { 
    "testField": "000681" 
    } 
} 
} 

에 대한

PUT ngramtest/MyEntity/123 
{ 
    "testField":"Z/16/000681" 

} 

AND,이 쿼리 이상하게 yeilds 결과 : I 시도 매핑이 ..

PUT ngramtest 
{ 
    "mappings": { 
    "MyEntity":{ 
     "properties": { 
     "testField":{ 
      "type": "text", 
      "analyzer": "my_analyzer" 
     } 
     } 

    } 
    }, 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "my_analyzer": { 
      "tokenizer": "my_tokenizer" 
     } 
     }, 
     "tokenizer": { 
     "my_tokenizer": { 
      "type": "ngram", 
      "min_gram": 3, 
      "max_gram": 5 
     } 
     } 
    } 
    } 
} 

이 같은 테스트 개체를 인덱싱 다음 문자열 분석 :

POST ngramtest/_analyze 
{ 
    "analyzer": "my_analyzer", 
    "text": "Z/16/000681." 
} 

내가 잘못하면 누가 나를 교정 해줄 수 있습니까?

답변

1

이유는 분석기 my_analyzer 검색에 사용되기 때문입니다. 따라서 단어가 6 문자 인 abcdef을 검색하면 해당 단어도 검색시 ngram 분석기에서 분석하여 토큰 abc, abcd, abcde, bcd 등을 생성하며 색인 토큰과 일치합니다.

당신이해야 할 것은 당신의 색인을 닦아 그것을 다시 채우기 전에 당신이 당신의 매핑

"testField":{ 
     "type": "text", 
     "analyzer": "my_analyzer", 
     "search_analyzer": "standard" 
    } 

search_analyzer 같은 표준 분석기를 사용하도록 지정하는 것입니다, 당신은 단순히 검색을 지정하여이 이론을 테스트 할 수 있습니다 분석기 :

GET ngramtest/MyEntity/_search 
{ 
    "query": { 
    "match": { 
     "testField": { 
     "query": "000681", 
     "analyzer": "standard" 
     } 
    } 
    } 
} 
+0

색인을 생성하고 JSON으로 검색 할 때 완벽하게 작동했습니다. BIG 감사합니다. :). 그러나 아직 .NET 응용 프로그램에서 사용되는 .NET (NEST) API를 사용하여이를 테스트하고 있습니다. ;) –

+0

굉장한, 그것이 기쁜 데 도움이! – Val

관련 문제