2017-01-09 1 views
1

여기에서 유스 케이스에 대한 솔루션을 찾는 데 문제가 있습니다. 기본적으로 매우 간단합니다. SQL like '%...%'처럼 "contains"쿼리를 수행해야합니다.Ngram Tokenizer on field, 쿼리가 아닌

정규식 쿼리가 있는데, 실제로 완벽하게 작동하지만, 규모가 심한 것처럼 보이기 때문에 nGrams를 사용해 보았습니다. 지금, 나는 그들과 함께 놀았고 "어떻게 작동하는지"알았지 만, 그 행동은 내가 기대하는 것이 아닙니다.

기본적으로 분석기는 mingram = 2, maxgram = 20으로 구성되었습니다. "Christophe"라는 사용자의 색인을 생성한다고 가정 해보십시오. 크리스가 5 그램의 크리스토프이기 때문에 쿼리 "크리스"가 실제로 일치하기를 원합니다. 문제는 "리조또"가 Ngrams로 분류되어 궁극적으로 "is"가 "Christophe"의 2-gram이기 때문에 일치합니다. 그래서 그것은 역시 일치합니다.

필자가 필요로하는 것은 분석기가 인덱싱 할 때 nGrams의 인덱싱 된 필드를 실제로 분석하여 FULL 텍스트 쿼리와 비교하는 것입니다. Risotto는 Risotto, XXXRisottoXXX 등과 일치해야하지만 Risolo가 아니거나 nGram이 일치하는 부분이 아닙니다.

해결책이 있습니까?

+1

: http://stackoverflow.com/questions/41543223/elasticsearch-does-not-respect-max-ngram-length-while-using-ngram -tokenizer/41543664? noredirect = 1 # comment70303094_41543664 (검색 시간에 '표준'분석기를 설정할 필요가 있음을 알려드립니다.) – Val

+0

감사합니다. Val! –

답변

2

별개의 색인 시간 및 검색 시간 분석기를 사용하려면 search_analyzer 설정을 사용해야합니다. 문서에서

샘플 :이 답변이 도움이 될 수

"mappings": { 
    "my_type": { 
    "properties": { 
     "text": { 
     "type": "text", 
     "analyzer": "autocomplete", 
     "search_analyzer": "standard" 
     } 
    } 
    } 
} 
+0

이 솔루션을 사용해 보았습니다. 한 단어 만 입력하면 매력적으로 보입니다. Chris for Christophe.하지만 Chris Sch를 입력하면 Christophe Schutz라는 기록을 찾지 못합니다. 성 및 성 모두에 대해 다중 조회를 사용하고 있으며 두 필드 모두에 search_analyzer를 추가했습니다. 어떤 단서? –