2017-05-26 1 views
5

Je voudrais mettre en évidence seulement les ngrams qui correspondent, pas le mot entier. Exemple:Comment mettre en évidence les jetons ngram dans un mot en utilisant la recherche élastique

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

Mapping est:

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

sont Analyzers:

"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" 
    } 
    } 
}, 

Exemple concret:

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

Le résultat est:

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

Avez-vous essayé jokers? par exemple. '* moi *'? – Montenegrodr

+0

oui mais ce n'est pas le problème. – Boti

+0

Je voudrais essayer d'aller avec un tokenizer/analyseur de caractères, pas sûr si c'est possible cependant. – Montenegrodr

Répondre

2

La bonne façon de réaliser ce que vous voulez utilise ngram comme tokenizer et non filtre. Vous pouvez faire quelque chose comme ceci:

"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" 
    } 
    } 
}, 

Il va générer la mise en évidence par ngram pour vous comme ceci:

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