2015-04-26 84 views
3

基本上我想刪除所有空格並將整個字符串標記爲單個標記。 (稍後我會使用NGRAM最重要的是。)Elasticsearch「pattern_replace」,在分析時替換空格

這是我的索引設置:

"settings": { 
"index": { 
    "analysis": { 
    "filter": { 
     "whitespace_remove": { 
     "type": "pattern_replace", 
     "pattern": " ", 
     "replacement": "" 
     } 
    }, 
    "analyzer": { 
     "meliuz_analyzer": { 
     "filter": [ 
      "lowercase", 
      "whitespace_remove" 
     ], 
     "type": "custom", 
     "tokenizer": "standard" 
     } 
    } 
    } 
} 

相反的"pattern": " ",我試過"pattern": "\\u0020"\\s了。

但是,當我分析文本「beleza na web」時,它仍然創建三個單獨的標記:「beleza」,「na」和「web」,而不是一個單獨的「belezanaweb」。

回答

12

分析器首先通過標記分析字符串,然後應用一系列標記過濾器來分析字符串。您已將標記器指定爲標準,表示輸入已使用分別創建標記的standard tokenizer進行標記。然後將模式替換過濾器應用於令牌。使用keyword tokenizer而不是標準標記器。其餘的映射是好的。 你可以改變你的映射如下

"settings": { 
"index": { 
    "analysis": { 
    "filter": { 
     "whitespace_remove": { 
     "type": "pattern_replace", 
     "pattern": " ", 
     "replacement": "" 
     } 
    }, 
    "analyzer": { 
     "meliuz_analyzer": { 
     "filter": [ 
      "lowercase", 
      "whitespace_remove", 
      "nGram" 
     ], 
     "type": "custom", 
     "tokenizer": "keyword" 
     } 
    } 
    } 
} 
+0

要在你爲什麼會使用關鍵字標記生成器在標準分詞器進一步擴大,關鍵字標記生成器採用輸入作爲一個單一的令牌,而標準分詞器使用標準的令牌分離分隔符列表(可以自定義)。因此,「堆棧溢出」這個句子被標記爲標準Tokenizer的「堆棧」和「溢出」,但關鍵詞Tokenizer會創建令牌「堆棧溢出」,然後正則表達式可以作爲單個輸入工作。 – Dagrooms