2016-06-10 5 views
0

Ich teste einige benutzerdefinierte Filter für ElasticSearch und weil ich obsessiv bin, habe ich mich entschieden, den Standard html_strip Zeichenfilter zu testen, um zu bestätigen, dass ich weiß, wie es funktioniert.Der html_strip Zeichenfilter in ElasticSearch ersetzt Tags durch Zeilenumbrüche?

So scheint es, dass ich nicht wissen, wie es funktioniert, weil ich angenommen, dass es alle HTML entfernen und es durch nichts ersetzen würde, aber es scheint verschiedene Dinge für verschiedene Tags, z. p (und div) Tags ersetzen mit Newline:

curl -XGET 'http://localhost:9200/test-analysis/_analyze?tokenizer=keyword&char_filters=html_strip&pretty=1' -d 'Oh <p class="stuff">pickles</p>!' 
{ 
    "tokens" : [ { 
    "token" : "Oh \npickles\n!", 
    "start_offset" : 0, 
    "end_offset" : 32, 
    "type" : "word", 
    "position" : 1 
    } ] 
} 

Die starke Tag-und einen Link mit nichts ersetzen:

curl -XGET 'http://localhost:9200/test-analysis/_analyze?tokenizer=keyword&char_filters=html_strip&pretty=1' -d 'Oh <a href="stuff">pickles</a>!' 
{ 
    "tokens" : [ { 
    "token" : "Oh pickles!", 
    "start_offset" : 0, 
    "end_offset" : 31, 
    "type" : "word", 
    "position" : 1 
} ] 
} 

Natürlich habe ich wieder einen Filter hinzufügen, die Zeilenumbrüche entfernt, aber gibt es eine Dokumentation über Dies?

Antwort

0

Der Grund für dieses Verhalten ist, dass HTML-Block-Tags wie <div>, <p>, etc durch Zeilenumbrüche und HTML-Inline-Tags ersetzt werden, wie a, strong, etc. werden einfach weggelassen.

Dies wird bestätigt, wenn Sie den Quellcode für HTMLStripCharFilter.java im Lucene-Quellcode betrachten. An einem gewissen Punkt in dieser Klasse können wir einige Konstanten wie diese sehen, die für sich sprechen:

private static final char BLOCK_LEVEL_START_TAG_REPLACEMENT = '\n'; 
    private static final char BLOCK_LEVEL_END_TAG_REPLACEMENT = '\n'; 
    private static final char BR_START_TAG_REPLACEMENT = '\n'; 
    private static final char BR_END_TAG_REPLACEMENT = '\n'; 
    private static final char SCRIPT_REPLACEMENT = '\n'; 
    private static final char STYLE_REPLACEMENT = '\n'; 
    private static final char REPLACEMENT_CHARACTER = '\uFFFD'; 

Die Idee ist, mehr oder weniger die gleichen Textabschnitte wiederzugeben, wie würde im Browser-Bildschirm wiedergegeben werden.

+0

Vielen Dank für den Link! Das macht Sinn, es ist nur komisch angesichts des Filternamens. – esperluette

Verwandte Themen