2014-07-09 3 views
5

ElasticSearch에서 와일드 카드 일치와 ngram을 결합 할 수 있습니까? 나는 이미 길이 3-11의 ngram을 사용하고 있습니다.ElasticSearch에서 ngrams와 함께 와일드 카드를 사용하는 방법

아주 작은 예로, C1239123 및 C123레코드가 있습니다. 사용자는이 두 가지를 모두 반환하려고합니다. 그들이 아는 유일한 정보입니다 : C123? 12

위의 사례는 쿼리에서 마지막 3 개가 누락되어 내 전체 검색 애널라이저에서 작동하지 않습니다. 와일드 카드와 일치하는 항목이 상자 밖으로 나갔다는 인상 아래에 있었지만 위와 유사한 검색을 수행하면 횡설수설합니다.

검색어 :

.Search<ElasticSearchProject>(a => a 
    .Size(100) 
    .Query(q => q 
     .SimpleQueryString(query => query 
      .OnFieldsWithBoost(b => b 
       .Add(f => f.Summary, 2.1) 
       .Add(f => f.Summary.Suffix("ngram"), 2.0) 
      .Query(searchQuery)))); 

분석기 :

var projectPartialMatch = new CustomAnalyzer 
{ 
    Filter = new List<string> { "lowercase", "asciifolding" }, 
    Tokenizer = "ngramtokenizer" 
}; 

토큰 화 :

.Tokenizers(t=>t 
    .Add("ngramtokenizer", new NGramTokenizer 
    { 
     TokenChars = new[] {"letter","digit","punctuation"}, 
     MaxGram = 11, 
     MinGram = 3 
    })) 

편집 : 주요 목적은 사용자가 정확히 어디에 검색 엔진을 말할 수 있도록하는 것입니다 알 수없는 문자가 있습니다. 그러면 일치 순서가 유지됩니다. 나는 쿼리를 ngram하지 않고, 인덱싱 된 필드만을 사용합니다.

더 많은 테스트 결과가있는 2를 편집하십시오. 이전 예제를 너무 많이 단순화했습니다. 횡령은 구두점 필터로 인해 발생했습니다. 적절한 예를 들면 횡설수설은 없지만 결과는 관련 순서대로 반환되지 않습니다. 아래에서 볼 수 있듯이 처음 두 결과가 전혀 일치하지 않는 이유는 확실하지 않습니다. Ngram은 쿼리에 적용되지 않습니다. ?

는 c.a123을 검색 하시나요 0.7 0의 순서로 결과를 제공합니다 C.A1234.800

  • C.A1234.700 <

    • C.A1234.560
    • 을 - 이것이 처음이 아니어야합니까?
    • C.A1234.950
    • 이의 해결 방법을 찾고 사람에게
  • +0

    'c123? 12 *'을 시도 했습니까? ElasticSearch에서 와일드 카드 일치 항목과 ngram을 조합해도 좋지만 작동 방식을 이해해야합니다. 그렇지 않으면 그것은 예기치 않은 결과를 반환합니다. –

    +0

    @ Duc.Duong 나는 그것을 시도했습니다. 결과를 반환하지만 쿼리와 관련이없는 것으로 보입니다. – Brandon

    +0

    일치하는 결과를 게시 할 수 있습니까? 우리는 더 많은 것을 조사 할 수 있습니다. –

    답변

    1

    는 와일드 카드는 기본적으로 ngrammed 토큰에 사용됩니다. 내 문제는 내 쿼리에 문장 부호가 있고 내 쿼리에서 표준 분석기를 사용하기 때문에 발생했습니다 (구두점이 어긋납니다).

    Inquisitor 플러그인을 사용하는 Duc.Duong의 제안은 데이터 분석 방법을 정확하게 보여주었습니다.

    관련 문제