2016-06-10 197 views
0

我正在測試ElasticSearch的一些自定義過濾器,因爲我很迷戀,所以我決定測試標準的html_strip字符過濾器,以確認我知道它是如何工作的。ElasticSearch中的html_strip字符過濾器用換行符替換標籤?

如此看來,我知道它是如何工作的,因爲我認爲它會去除所有的HTML,並沒有取代它,但它似乎對不同的標籤,例如做不同的事情P(與格)標籤與換行符替換:

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 
    } ] 
} 

強勁的標籤和鏈接用什麼代替:

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 
} ] 
} 

當然,我可以添加另一個過濾器,去除換行符,但沒有任何有關文檔這個?

回答

0

這樣做的原因行爲是HTML塊標籤如<div><p>等由換行字符和HTML內嵌標記如astrong等被簡單地消除更換。

當在Lucene源代碼中查看HTMLStripCharFilter.java的源代碼時,可以確認這一點。在該類中的某些時候,我們可以看到幾個常數這樣的,這不言自明:

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'; 

的想法是或多或少複製相同文本的段落將在瀏覽器屏幕呈現。

+0

非常感謝您的鏈接!這是有道理的,給出過濾器名稱就很奇怪。 – esperluette