2017-05-26 41 views
5

Chciałbym podkreślić tylko pasujące do siebie ngramy, a nie całe słowo. przykład:Jak wyróżnić tokeny ngram w słowie za pomocą elastycznego wyszukiwania

term: "Wo" 
highlight should be: "<em>Wo</em>nderfull world!" 
currently it is: "<em>Wonderfull</em> world!" 

mapowania:

{ 
    "global_search_1495732922733" : { 
    "mappings" : { 
     "meeting" : { 
     "properties" : { 
     ... 
      "name" : { 
      "type" : "text", 
      "analyzer" : "meeteor_index_analyzer", 
      "search_analyzer" : "meeteor_search_term_analyzer" 
      }, 
      ... 
     } 
     } 
    } 
    } 
} 

analizatory:

"analysis" : { 
    "filter" : { 
    "meeteor_stemmer" : { 
     "name" : "english", 
     "type" : "stemmer" 
    }, 
    "meeteor_ngram" : { 
     "type" : "nGram", 
     "min_gram" : "2", 
     "max_gram" : "15" 
    } 
    }, 
    "analyzer" : { 
    "meeteor_search_term_analyzer" : { 
     "filter" : [ 
     "lowercase", 
     "asciifolding" 
     ], 
     "tokenizer" : "standard" 
    }, 
    "meeteor_index_analyzer" : { 
     "filter" : [ 
     "lowercase", 
     "asciifolding", 
     "meeteor_ngram" 
     ], 
     "tokenizer" : "standard" 
    }, 
    "meeteor_project_id_analyzer" : { 
     "tokenizer" : "standard" 
    } 
    } 
}, 

konkretny przykład:

curl -XGET 'localhost:9200/global_search/meeting/_search?pretty' -H 'Content-Type: application/json' -d' 
{ 
    "query": { 
     "match": { 
      "name": "Me" 
     } 
    }, 
    "highlight":{ 
     "fields": { 
     "name": {} 
     } 
    } 
} 
' 

Wynikiem jest:

"...highlight" : { 
      "name" : [ 
      "Sad <em>Meeting</em>" 
      ] 
     } 
+0

próbowałeś symboli wieloznacznych? na przykład '* ja *?? – Montenegrodr

+0

tak, ale to nie jest problem. – Boti

+0

Chciałbym spróbować z tokenizerem/analizatorem znaków, nie jestem pewien, czy jest to możliwe. – Montenegrodr

Odpowiedz

2

Poprawny sposób, aby osiągnąć to, co chcesz korzysta Ngram jak Tokenizer i nie filtr. Można zrobić coś takiego:

"analysis" : { 
    "filter" : { 
    "meeteor_stemmer" : { 
     "name" : "english", 
     "type" : "stemmer" 
    } 
    }, 
    "tokenizer" : { 
    "meeteor_ngram_tokenizer" : { 
     "type" : "nGram", 
     "min_gram" : "2", 
     "max_gram" : "15" 
    } 
    }, 
    "analyzer" : { 
    "meeteor_search_term_analyzer" : { 
     "filter" : [ 
     "lowercase", 
     "asciifolding" 
     ], 
     "tokenizer" : "standard" 
    }, 
    "meeteor_index_analyzer" : { 
     "filter" : [ 
     "lowercase", 
     "asciifolding" 
     ], 
     "tokenizer" : "meeteor_ngram_tokenizer" 
    }, 
    "meeteor_project_id_analyzer" : { 
     "tokenizer" : "standard" 
    } 
    } 
}, 

To wygeneruje podświetlanie przez Ngram dla ciebie tak:

"...highlight" : { 
      "name" : [ 
      "Sad <em>Me</em>eting" 
      ] 
     }