2016-03-01 59 views
1

我們在我們的應用程序中使用空白分析器配置了彈性搜索。這句話是記號化的空白,所以像<fantastic> project一個名稱索引爲使用彈性搜索檢索標記內容和連字詞

["<fantastic>", "project"] 

ABC-123的高清項目被收錄爲

["ABC-123-def", "project"] 

當我們再搜索ABC- *預期的項目出現。但是,如果我們專門搜索<fantastic>它根本不會顯示出來。就像Lucene/Elastic Search忽略任何包含尖括號的搜索項。但是,我們可以搜索fantastic<*fantastic**fantastic*,它發現它很好,即使該單詞沒有與尖括號分開索引。

標準分析器對任何非字母數字字符進行標記。 <fantatsic>項目索引爲

["fantastic", "project"] 

ABC-123-DEF項目索引爲

["ABC", "123", "def", "project"] 

這打破了使用ABC-123-*成功地進行搜索的能力。但是,我們用標準分析儀得到的結果是,有人可以專門搜索<fantastic>,並返回所需的結果。

如果不是一個標準的分析器我們添加一個char_filter到空白分析器過濾掉上的標籤的尖括號,(取代<(.*)>$1)應當由此索引: <fantatsic> project被索引爲

["fantastic", "project"] 

(無尖括號)。和ABC-123的高清項目被收錄爲

["ABC-123-def", "project"] 

它看起來很有希望,但我們結束了相同的結果作爲普通的空白分析:當我們爲<fantastic>專門搜索,我們什麼也沒得到,但*fantastic*工作正常。

任何人都可以在堆棧溢出解釋這種怪異?

回答

2

你可以創建一個特殊字符標記生成器,請看下面的例子

{ 
    "settings" : { 
     "index" : { 
      "number_of_shards" : 1, 
      "number_of_replicas" : 1 
     }, 
     "analysis" : { 
      "filter" : { 
       "custom_filter" : { 
        "type" : "word_delimiter", 
        "type_table": ["> => ALPHA", "< => ALPHA"] 
       } 
      }, 
      "analyzer" : { 
       "custom_analyzer" : { 
        "type" : "custom", 
        "tokenizer" : "whitespace", 
        "filter" : ["lowercase", "custom_filter"] 
       } 
      } 
     } 
    }, 
    "mappings" : { 
     "my_type" : { 
      "properties" : { 
       "msg" : { 
        "type" : "string", 
        "analyzer" : "custom_analyzer" 
       } 
      } 
     } 
    } 
} 

<>爲字母字符導致底層word_delimiter將它們視爲字母字符。

+1

正是我在找什麼,謝謝! – GLaDOS